gpt4 book ai didi

ios - 阻止 `self` 在 block 中创建强引用

转载 作者:行者123 更新时间:2023-11-28 20:59:47 26 4
gpt4 key购买 nike

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

据我了解,当您创建 block 时,最好的做法是创建一个弱 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];

最佳答案

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

关于ios - 阻止 `self` 在 block 中创建强引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49944048/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com