1

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

(他不相信我)

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

2 回答 2

2

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

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

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


我心中的问题是,如果您要分派回主队列,这表明您正处于某个后台队列的耗时之中。在这种情况下,避免强烈提及self可能是谨慎的做法。我们不能说没有看到您在哪里执行此代码的更广泛的上下文。

于 2020-12-11T20:26:47.517 回答
1

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

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

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

在某些情况下,其他对象负责对象的生命周期,并且_someHelper当来自其他对象的强裁判过期时(例如不再需要任何操作),应该阻止调用。在这种情况下,你需要弱自我。

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

于 2020-12-11T19:37:48.027 回答