块中的弱自我
我是否需要检查弱自我是否为零?
我创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
。
因此,你的代码可能会被引用nil
的weakSelf
执行。 但这是没有理由检查它。 特别是在Objective-C中,如果发送消息nil
,则使用定义的行为。 I. e。 它是完美的代码,如果你设置一个属性使用nil
引用。 它只是无处可去。
当然有时候你不想和nil
交互。 在这种情况下,你必须检查它。
顺便说一句:你只需要在一些很less的情况下需要weakSelf
。 这是一个城市传说,在封闭的一般提到self
必须弱,以防止保留周期。 这是不正确的,这是不正确的,它永远不会是真实的。