iOS 和 ObjC 中不需要 weakSelf _always_,对吧?[复制]

weakSelf not _always_ needed in iOS and ObjC, right? [duplicate]

提问人:h.and.h 提问时间:12/12/2020 最后编辑:mfaanih.and.h 更新时间:12/12/2020 访问量:46

问:

帮我解决与同事的一个小争吵。在这种情况下,不需要软弱的自我,对吧?

(他不相信我)

__weak auto weakSelf = self;
dispatch_async(dispatch_get_main_queue(), ^{
    [weakSelf _someHelper];
});
iOS Objective-C 内存管理 IOS 多线程

评论


答:

1赞 Marek R 12/12/2020 #1

请注意,ARC(自动参考计数器)可能会导致强参考将产生循环的情况。这样的循环将导致内存泄漏(引用计数器永远不会达到零)。在可以进行垃圾回收的语言中,gc 可以检测到这样的循环,并且内存将被释放。

现在,弱指针可防止创建强引用的永久循环。

所举的例子是一般地判断这是否有必要。

在某些情况下,其他对象负责对象生存期,当来自其他对象的强引用已过期时,应阻止调用(例如,不再需要操作)。在这种情况下,你需要软弱的自我。_someHelper

在其他情况下,即使所有其他对象都与此对象失去联系,您也需要执行保修,因此在这种情况下,您需要调度队列包含对对象的强引用。在这种情况下,软弱的自我已经过时了。_someHelper

2赞 Rob 12/12/2020 #2

没错,在这种情况下并不总是需要它。在这种情况下,我们通常不会为这种句法噪音而烦恼。

如果是,或者如果这个调度回主队列被埋在某个异步调用中,那么有一个模式的参数(所以你不会保留强引用超过可能需要的时间),但在你的简单示例中,立即调度到主队列,不需要弱引用。dispatch_afterweakSelfself

话虽如此,在这里采用模式并没有。只是没有必要。weakSelf


我心中的问题是,如果你要调度回主队列,那就表明你正在处理一些后台队列上耗时的事情。在这种情况下,避免强烈提及可能是谨慎的。我们不能说没有看到你在哪里执行此代码的更广泛的上下文。self