1

失敗の遅延後にメソッドを再試行するコールバックを作成しようとしていました。私はこの警告を打っています:

「このブロックで障害ブロックを強くキャプチャすると、保持サイクルが発生する可能性があります。」

typedef void (^MyCallbackBlock)(NSObject *);

...

__block MyObject *blockSelf = self;
__block MyCallbackBlock successBlock = ^(NSObject *someObject)
{
    // To be completed
};
__block MyCallbackBlock failureBlock = ^(NSObject *someObject)
{
    double delayInSeconds = 2.0;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        [blockSelf doSomething:someObject onSuccess:successBlock onFailure:failureBlock]; // <-- Warning is here
    });
};
[blockSelf doSomething:someObject onSuccess:successBlock onFailure:failureBlock];

...

- (void)doSomething:(NSObject *)someObject
          onSuccess:(MyCallbackBlock)successBlock
          onFailure:(MyCallbackBlock)failureBlock;

質問: どうすればこれを適切に機能させることができますか?

(私は他のSOの質問を読んでいます-一致するものはまだ見つかりませんが、そこにあったとしても驚かないでしょう。)

4

2 に答える 2

0

次のように、追加__unsafe_unretainedが機能しました。

__unsafe_unretained __block MyCallbackBlock successBlock = ^(NSObject *someObject)
{
    // To be completed
};

動作する可能性があるように見え__weakましたが、実際にはアプリケーションがクラッシュしました。この答えが理由を説明していることは 100% 明らかではありませんが、私はそれがそれらの線に沿ったものであると想像しています.

于 2013-05-23T15:20:30.970 に答える