[英]Do I need to check for nil on my strongSelf = weakSelf assignment inside a block?
例如,我正在使用SVInfiniteScrolling( https://github.com/alexanderedge/SVInfiniteScrolling )。
我有一些看起来像这样的代码...
- (void)initializeInfiniteScrollingForTableView {
__weak MyViewController *weakSelf = self;
[self.tableView addInfiniteScrollingWithActionHandler:^{
MyViewController *strongSelf = weakSelf;
if (!strongSelf.endReached) {
[strongSelf fetchData];
}
else {
[strongSelf.tableView.infiniteScrollingView stopAnimating];
}
}];
}
我想知道的是...在像这样使用之前,我是否需要检查strongSelf是否为零...
...
[self.tableView addInfiniteScrollingWithActionHandler:^{
MyViewController *strongSelf = weakSelf;
if (strongSelf) { // <== ** Is this needed? **
if (!strongSelf.endReached) {
这就是为什么我问。 从此链接上的第3点( http://www.apeth.com/iOSBook/ch12.html#EXstrongWeakDance )来看, “零测试是因为在多线程情况下,我们对自我的弱引用可能已从在我们之前没有进行下一步;那么它将为零,因为它是ARC的弱参考,在那种情况下将毫无意义。
需要这张支票吗? 我以为您是第一次在块中使用对weakSelf的引用时,该表达式会在表达式持续时间内保留吗?
我认为在您看来:
if (!strongSelf.endReached) {
如果self为零,则结果将为YES,这可能不是您想要的。
碰巧您的代码做了正确的事情(什么也不做),因为两个子句都只使用self来调用方法,然后什么也不会发生。 最终结果与进行nil-check相同,但是执行路径错误。 如果有人添加了不使用self的代码,将来可能会产生后果。
对于您发布的代码,无需检查nil
。
这行代码:
if (!strongSelf.endReached) {
如果strongSelf为nil,则将评估为false。 进一步阅读: 向nil发送消息?
然后这行代码将执行:
[strongSelf.tableView.infiniteScrollingView stopAnimating];
如果strongSelf为零,那么该行将根本不执行任何操作(甚至不会出错)。
但是,一些开发人员认为最好还是检查nil,以防万一有人后来添加了代码并且确实关心nil。 因此,您应该考虑这样做:
MyViewController *strongSelf = weakSelf;
if (!strongSelf) {
return;
}
... the rest of your code ...
您的消息来源是指这样的事实,即weakSelf
在执行该块之前, weakSelf
可能已被释放并nil
; 因此,在strongSelf
获得强大的参考并保留之前。 所述strongSelf
是确保通过引用的对象weakSelf
不是nil
块的执行期间 “d。
ARC中没有“使用”变量的概念,因此在处理__weak
变量时有必要retain
它__weak
__weak
明确选择退出。
话虽这么说,在这种情况下检查并不是严格意义上的,因为发送到nil
消息始终是无操作的。 如果您打算将strongSelf
插入一个数组中,或者如果在消息之间取消分配它会使您的程序处于无效状态,那将是另一回事。
总而言之,每当需要确保__weak
变量在一段时间内不会nil
时,请使用__strong
,并在使用前检查它是否为nil
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.