进行涉及Objective-C块的递归时,我在iOS应用程序中收到EXC_BAD_ACCESS信号。这是简化的代码:
- (void)problematicMethod:(FriendInfo*)friendInfo onComplete:(void(^)(NSString*))onComplete1 {
[self doSomethingWithFriend:friendInfo onComplete:^(Response* response) {
switch (response.status) {
case IS_OK:
onComplete1(message);
break;
case ISNT_OK:
// Recursively calls the method until a different response is received
[self problematicMethod:friendInfo onComplete:onComplete1];
break;
default:
break;
}
}];
}
因此,基本上,在此简化版本中,有问题的方法调用doSomethingWithFriend:onComplete:。当该方法完成时(onComplete),并且一切正常,则将调用原始的onComplete1块,并且可以正常工作。
但是,如果出现问题,则需要再次调用problematicMethod(递归部分),并且在第一次发生这种情况时,我立即获得EXC_BAD_ACCESS信号。
任何形式的帮助将不胜感激。
最佳答案
您如何创建区块?请记住,您必须将其从堆栈移动到堆。
例:
void(^onCompleteBlock)(NSString*) = [[^(NSString* param) {
//...block code
}] copy] autorelease];
[self problematicMethod:friendInfo onCompleteBlock];