我知道块是客观的 c 对象,可以在使用 ARC 时直接放入 NSDictionary 而无需 Block_copy。 但是我收到了这段代码的 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。