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

Preventing `self` from creating a strong reference in blocks

随着最近的 XCode 更新,一些代码块显示为警告,其中 "Block implicitly retains 'self'"

据我了解,当您创建块时,最好创建一个弱自身,以避免创建不会被垃圾收集的强引用。

在下面的示例中,我按照 XCode 的建议将 myArray 设置为 self->myArray这会创建强引用吗? 为什么我不能使用“weakSelf->myArray”?尝试这样做会导致此错误:

Dereferencing a __weak pointer is not allowed due to possible null value caused by race condition, assign it to strong variable first

我以为重点是创建弱引用? 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];

错误信息是对的。您必须执行 "weak-strong dance"。你只做了一半的舞蹈。将 self 作为 weak 传递到块中,然后 立即 在块内将其分配给强引用(如在您编辑的 "Would recasting to be the correct way?" 中)。