块中的弱自我

我是否需要检查弱自我是否为零?

我创buildweakSelf指针,如:

__weak typeof(self) weakSelf = self; 

并在我开始的块

 if(!weakSelf){return;} 

这是不必要的? 或者是否依赖于我是否正确地编写了其余部分,以便当自我死亡,其他人死亡?

这种检查是不必要的,给你一个错误的安全感。

这是问题:

 __weak typeof(self) weakSelf = self; dispatch_async(dispatch_get_main_queue(), ^{ if (!weakSelf) { return; } // THE LINE OF INTEREST [weakSelf doSomething]; }); 

weakSelf ,一些其他的线程可能会清除最后一个强烈的self引用,此时weakSelf被设置为零。 所以doSomething消息被发送到零,这是“安全”(它什么都不做),但可能不是你所期望的!

如果你想在weakSelf时候采取不同的行动, weakSelf

 __weak typeof(self) weakSelf = self; dispatch_async(dispatch_get_main_queue(), ^{ if (weakSelf) { [weakSelf doSomething]; } else { [someOtherObject doSomethingElse]; } }); 

在这种情况下,在块validationweakSelf不为零的时间与发送doSomething消息的时间之间, weakSelf可能变成零,并且既不会有东西也不会实际运行。

正确的解决scheme是这样的:

 __weak typeof(self) weakSelf = self; dispatch_async(dispatch_get_main_queue(), ^{ typeof(self) strongSelf = weakSelf; if (strongSelf) { [strongSelf doSomething]; } else { [someOtherObject doSomethingElse]; } }); 

在这种情况下,将weakSelf复制到strongSelf (默认情况下是强壮的)是primefaces的。 如果weakSelf自己为零, strongSelf自己就是零。 如果weakSelf不是零, strongSelf不会零, strongSelf强烈地提到对象,阻止它在doSomething消息之前被释放。

由于在nil上调用消息是没有任何操作的,所以似乎没有必要。 (什么都没发生)

 ^{ [weakSelf doSomething]; //Does nothing if weakSelf is nil } 

我能想到的唯一原因可能是想要这样做,如果其他消息(而不是自己)不应该被调用

 ^{ // Here I don't want to add weakSelf as an observer if it's nil if (!weakSelf) return; [OtherClass addObserverForSomething:weakSelf]; } 

弱引用不保留引用的对象。 如果没有其他人保留它,对象被释放,而弱引用指向nil

因此,你的代码可能会被引用nilweakSelf执行。 但这是没有理由检查它。 特别是在Objective-C中,如果发送消息nil ,则使用定义的行为。 I. e。 它是完美的代码,如果你设置一个属性使用nil引用。 它只是无处可去。

当然有时候你不想和nil交互。 在这种情况下,你必须检查它。

顺便说一句:你只需要在一些很less的情况下需要weakSelf 。 这是一个城市传说,在封闭的一般提到self必须弱,以防止保留周期。 这是不正确的,这是不正确的,它永远不会是真实的。