ブロックは目的の c オブジェクトであり、ARC を使用する場合は Block_copy なしで NSDictionary に直接配置できることを理解しています。 しかし、次のコードで EXC_BAD_ACCESS エラーが発生しました。
- (void)viewDidLoad
{
[super viewDidLoad];
[self method1:^(BOOL result){
NSLog(@"method1WithBlock finished %d", result);
}];
}
- (void) method1:(void (^)(BOOL))finish{
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:^(NSData *rcb){
finish(YES);
}, @"success",
^(NSError *error){
finish(NO);
}, @"failure", nil];
[self method2:dict];
}
- (void) method2:(NSDictionary *)dict{
void (^success)(NSData *rcb) = [dict objectForKey:@"success"];
success(nil);
}
method1: をこれに変更すると、エラーは発生しません。
- (void) method1:(void (^)(BOOL))finish{
void (^success)(NSData *) = ^(NSData *rcb){
finish(YES);
};
void (^failure)(NSError *error) = ^(NSError *error){
finish(NO);
};
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:success, @"success",
failure, @"failure", nil];
[self method2:dict];
}
ブロックを辞書に入れる前に、自動変数を使用してブロックを格納する必要がある理由を誰か説明できますか?
iOS SDK 6.1 を使用しています。