可以__在自动变零的块中间吗?

在后台线程上运行的块中使用__weak self引用时,我只需要在开始时检查nil ,还是在第一个niltesting通过后执行期间, __weak self也可以变为nil? 我想在块中访问自己的一些Ivars,并且在块执行时我需要最新的值。

如果没有人提到self那么是的。 您可以通过在该块中强有力的参考来减轻这一点

 __weak __typeof(self) weakSelf = self; ^{ __strong __typeof(weakSelf) strongSelf = weakSelf; if (!strongSelf) { return; } }; 

您可以避免将参考设置为零,方法是从块内部强烈引用它。

获得对块内弱指针的强烈引用。

 __weak MyObject *weakSelf = self; // a weak reference myBlock = ^{ MyObject *innerSelf = weakSelf; // a block-local strong reference NSLog(@"MyObject: %@", innerSelf); }; 

避免直接使用variables,因为这会导致保留周期。 如果直接在块中使用实例variables,块将捕获自己,所以您必须使用其访问器来引用实例variables。

 __weak MyObject *weakSelf = self; myBlock = ^{ MyObject *innerSelf = weakSelf; // a block-local strong reference NSLog(@"MyObject: %@", innerSelf); NSLog(@"MyObject ID: %d", innerSelf.objectID); }; 

如果直接使用这些实例variables:

 NSLog(@"MyObject ID: %d", _objectID); 

编译器将_objectID解释为self->_objectID ,其中self由您的块捕获。

这是一个弱引用的性质,当最后一个强引用在另一个线程中被移除时,它可以随时变成零。 如果你访问成员variables是致命的,因为你会崩溃,如果你调用一个弱variables的方法,这是致命的,因为self是不安全的。

有一个微不足道的方法来解决每个人都使用的方法:在做任何事情之前,将弱variables存储到一个string中,而不进行任何检查。 然后你检查强variables是否为零; 该检查是需要一次的

打开Xcode中的所有警告,如果你做任何危险的事情,你会得到一个警告。