防止 `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?" 中)。
随着最近的 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?" 中)。