通过最近的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];
答案 0 :(得分:2)
错误消息是正确的。你必须做强弱的舞蹈&#34;。你只做了一半的舞蹈。将self
作为弱点传递到块中,然后立即将其在块内分配给强引用(如在编辑过的&#34;将重铸为正确的方式? &#34)