2013-05-01 44 views
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问题 - 还没有找到一个匹配的是,虽然不会感到惊讶,如果一个人在那里)

+0

这可能是答案,给它一个尝试:http://stackoverflow.com/questions/7205128/fix-warning-capturing-an-object-strongly-in-this-block-is-likely-to-导致一 – 2013-05-01 20:27:58

回答

0

添加__unsafe_unretained工作,如:

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

虽然看起来可能__weak可以工作,在实践中引起了我的应用程序崩溃。 this answer解释原因并不是100%清楚,但我想象的是这些。

2

是,该块需要捕获本身(以及self)作为弱参考。

如果您使用ARC *,它应该是这样的:

MyObject *__weak blockSelf = self; 
__block __weak MyCallbackBlock weakSuccessBlock; 
MyCallbackBlock successBlock = weakSuccessBlock = ^(NSObject *someObject) 
{ 
    // To be completed 
}; 
__block __weak MyCallbackBlock weakFailureBlock; 
MyCallbackBlock failureBlock = weakFailureBlock = ^(NSObject *someObject) 
{ 
    MyCallbackBlock strongSuccessBlock = weakSuccessBlock; 
    MyCallbackBlock strongFailureBlock = weakFailureBlock; 
    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:strongSuccessBlock onFailure:strongFailureBlock]; 
    }); 
}; 

如果你不使用ARC,更换__block __weak__weak以上只是__block


*:Objective-C中自动引用计数

+0

添加关于ARC的脚注,因为我不得不谷歌它理解。 – 2013-05-02 06:47:57

+0

__block和__weak的顺序是否重要? – 2013-05-02 14:16:21

+1

@BenFlynn:没有。但'__block'适用于变量,而'__weak'适用于指针类型 – newacct 2013-05-02 19:38:57

相关问题