3

在执行涉及 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块,这工作正常。

但是如果出现问题,需要再次调用problemMethod(递归部分),当第一次发生这种情况时,我会立即收到EXC_BAD_ACCESS 信号。

任何形式的帮助将不胜感激。

4

2 回答 2

2

你是如何创建你的块的?请记住,您必须将它从堆栈移动到堆。

例子:

 void(^onCompleteBlock)(NSString*) = [[^(NSString* param) {
  //...block code
}] copy] autorelease];

[self problematicMethod:friendInfo onCompleteBlock];

于 2012-07-11T08:43:16.793 回答
0

如果 response.status 值为 ISNT_OK 你永远不会完成递归调用该函数。

于 2012-09-23T01:23:39.633 回答