Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 将自身作为参数传递给方法的块导致编译器警告_Objective C_Objective C Blocks - Fatal编程技术网

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