繁体   English   中英

我是否需要在代码块中检查strongSelf = weakSelf分配是否为零?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM