iOS 和 ObjC 中并不_总是_需要 weakSelf,对吧?

weakSelf not _always_ needed in iOS and ObjC, right?

帮我解决与同事的小争执。这种情况下不需要弱小的自己吧?

(他不相信我)

__weak auto weakSelf = self;
dispatch_async(dispatch_get_main_queue(), ^{
    [weakSelf _someHelper];
});

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

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

给出的例子只是为了说明是否有必要。

在某些情况下,某些其他对象负责对象的生命周期,当来自其他对象的强推荐人已过期时(例如,不再需要采取任何行动),应避免调用 _someHelper。在这种情况下你需要 weak self.

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

正确,在这种情况下并不总是需要。在这种情况下,我们通常不会理会这种语法噪音。

如果它是 dispatch_after 或者如果这个返回主队列的调度被埋在一些异步调用中,那么有一个 weakSelf 模式的参数(所以你不会保持强引用更长比可能需要的更多),但在您的简单示例中,立即分派到主队列,不需要对 self 的弱引用。

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


我心中的问题是,如果您正在分派回主队列,这表明您正处于某个后台队列的耗时过程中。在这种情况下,避免对 self 保持强引用可能是明智的。我们不能在没有看到您执行此代码的更广泛上下文的情况下说。