Objective c 将自身作为参数传递给方法的块导致编译器警告
我试图创建一个回调,在延迟失败后重试该方法。我要提醒你: “在此块中强烈捕获故障块可能会导致保留周期。”Objective c 将自身作为参数传递给方法的块导致编译器警告,objective-c,objective-c-blocks,Objective C,Objective C Blocks,我试图创建一个回调,在延迟失败后重试该方法。我要提醒你: “在此块中强烈捕获故障块可能会导致保留周期。” typedef void(^MyCallbackBlock)(NSObject*); ... __块MyObject*blockSelf=self; __block MyCallbackBlock successBlock=^(NSObject*someObject) { //待完成 }; __block MyCallbackBlock failureBlock=^(NSObject*som
typedef void(^MyCallbackBlock)(NSObject*);
...
__块MyObject*blockSelf=self;
__block MyCallbackBlock successBlock=^(NSObject*someObject)
{
//待完成
};
__block MyCallbackBlock failureBlock=^(NSObject*someObject)
{
双延迟频率=2.0;
dispatch_time_t popTime=dispatch_time(dispatch_time_NOW,(int64_t)(DelayUnseconds*NSEC_PER_SEC));
调度\u after(popTime,调度\u get\u main\u queue(),^(void){
[blockSelf doSomething:someObject on success:successBlock on failure:failureBlock];//是的,块需要捕获自身(以及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,请将上面的\uuuu块\uu弱
和\uu弱
替换为\uu块
*:Objective-C自动参考计数添加\u不安全\u未恢复
工作,如:
__unsafe_unretained __block MyCallbackBlock successBlock = ^(NSObject *someObject)
{
// To be completed
};
虽然看起来很有可能\u-weak
可以工作,但实际上它导致了我的应用程序崩溃。原因还不是100%清楚,但我想象这是沿着这些思路来的。这可能是答案,尝试一下:添加了关于ARC的脚注,因为我必须用谷歌搜索它。顺序是否阻止和__弱物质?@BenFlynn:不。但是\uu block
适用于变量,而\uu-weak
适用于指针类型谢谢。我需要支持4.3,所以我使用了uu-safe\u-unrepaired来代替u-weak,但您的答案有助于澄清发生了什么。这实际上会崩溃,除非您使用u-safe\u-unrepaired(至少在iOS 5上)。
__unsafe_unretained __block MyCallbackBlock successBlock = ^(NSObject *someObject)
{
// To be completed
};