可以__在自动变零的块中间吗?
在后台线程上运行的块中使用__weak
self
引用时,我只需要在开始时检查nil
,还是在第一个nil
testing通过后执行期间, __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中的所有警告,如果你做任何危险的事情,你会得到一个警告。