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;
    }
}];
}

基本的に、この単純化されたバージョンでは、ProblemMethodはdoSomethingWithFriend:onComplete:を呼び出します。そのメソッドが終了すると ( onComplete )、すべてが問題なければ、元のonComplete1ブロックが呼び出され、これは正常に機能します。

しかし、何か問題が発生した場合は、problemableMethodを再度呼び出す必要があり (再帰部分)、これが初めて発生したときに、すぐに 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 に答える