防止`self`在块中创建强引用

时间:2018-04-20 14:31:31

标签: ios objective-c objective-c-blocks

通过最近的XCode更新,一些代码块显示为警告,其中 &#34; Block隐含地保留&#39;&#34; < / p>

我的理解是,在创建块时,最好创建一个弱自我,以防止创建一个不会被垃圾回收的强引用。

在下面的示例中,我按照XCode的建议将myArray设置为self->myArray这会创建强大的参考吗?为什么我不能使用&#39; weakSelf-&gt; myArray`?试图这样做会导致此错误:

  

由于可能为null,因此不允许取消引用__weak指针   由竞争条件引起的价值,首先将其分配给强变量

我认为重点是制造弱反射?不是weakSelf只是指向self

的指针

以下实例中甚至需要self->吗?

@interface SomeViewController (){
    NSMutableArray * myArray;
}
@end


- (void) doSomethingInBackground {
    // Do NSURLSessionTask on the background and onCompletion call mySuccessBlock.
}



- (SomeBlock) mySuccessBlock {

    __block __typeof__(SomeViewController) __weak * weakSelf = self;

    return ^(NSDictionary* result){

//this line is my related to my question
        self->myArray = [weakSelf sortResultsAlphabetically: result];

        dispatch_async(dispatch_get_main_queue(), ^{
            [weakSelf.tableView reloadData]
        });

    };
}

重铸是正确的方法吗?

SomeViewController * strongSelf = weakSelf;
strongSelf->myArray = [weakSelf sortResultsAlphabetically: result];

1 个答案:

答案 0 :(得分:2)

错误消息是正确的。你必须做强弱的舞蹈&#34;。你只做了一半的舞蹈。将self作为弱点传递到块中,然后立即将其在块内分配给强引用(如在编辑过的&#34;将重铸为正确的方式? &#34)