Я понимаю, что блоки являются объективными объектами c и могут быть помещены в NSDictionary напрямую без Block_copy при использовании ARC. Но я получил ошибку EXC_BAD_ACCESS с этим кодом:NSDictionary of Blocks как аргумент вызывает переполнение
- (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];
}
Может кто-нибудь объяснить, почему я должен использовать автоматические переменные для хранения блоков, прежде чем положить их в словарь?
Я использую SDK iOS 6.1.
так что разница между двумя _method1: _ является блочным литералом на стеке и блочным объектом в куче? –
является '__NSGlobalBlock__' документированным? –
@ user1122742: На самом деле, когда вы вводите «po dict» в отладчике в вашем первом 'method1:', вы увидите, что 'success' является' __NSMallocBlock__' и 'error' является' __NSStackBlock__'. Разница, вероятно, вызвана тем, что 'dictionaryWithObjectsAndKeys:' принимает список переменных аргументов. Я просто оставлю это как подробно в реализации и придерживаюсь документации, в которой четко сказано, что вам нужно скопировать блоки, которые помещаются в массив или словарь. –