[英]Can __weak self turn nil in the middle of the block?
当在后台线程上运行的块中使用__weak
self
引用时,我是否仅需要在开始时检查nil
,或者即使在第一个nil
测试通过后执行期间__weak
self
也可以变为nil? 我想从代码块中的self
访问一些ivars,并且在代码块执行时需要最新的值。
如果没有人提到self
那就是。 您可以通过在代码块中充分引用来减轻这种情况
__weak __typeof(self) weakSelf = self;
^{
__strong __typeof(weakSelf) strongSelf = weakSelf;
if (!strongSelf) {
return;
}
};
通过从块内部强烈引用,可以避免将引用设置为nil。
强烈引用块内的弱指针。
__weak MyObject *weakSelf = self; // a weak reference
myBlock = ^{
MyObject *innerSelf = weakSelf; // a block-local strong reference
NSLog(@"MyObject: %@", innerSelf);
};
避免直接使用变量,因为这会导致保留周期。 如果直接在块内使用实例变量,则该块将捕获self,因此您必须使用其访问器来引用实例变量。
__weak MyObject *weakSelf = self;
myBlock = ^{
MyObject *innerSelf = weakSelf; // a block-local strong reference
NSLog(@"MyObject: %@", innerSelf);
NSLog(@"MyObject ID: %d", innerSelf.objectID);
};
如果您像这样直接使用实例变量:
NSLog(@"MyObject ID: %d", _objectID);
编译器将_objectID
解释为self->_objectID
,其中self被您的块捕获。
弱引用的本质是,当在另一个线程中删除最后一个强引用时,它随时可能变为零。 如果您访问成员变量,这将是致命的,因为这将导致崩溃;而如果对该弱变量调用方法,则将是致命的,因为self是不安全的,无法保留。
每个人都可以使用一种简单的方法来解决此问题:在执行任何操作之前,不做任何检查就将弱变量存储到字符串中。 然后检查强变量是否为nil; 那检查需要一次 。
在Xcode中打开所有警告,因此,如果您做任何危险的事情,都会收到警告。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.