帮我解决与同事的小争执。在这种情况下不需要弱自我,对吧?
(他不相信我)
__weak auto weakSelf = self;
dispatch_async(dispatch_get_main_queue(), ^{
[weakSelf _someHelper];
});
帮我解决与同事的小争执。在这种情况下不需要弱自我,对吧?
(他不相信我)
__weak auto weakSelf = self;
dispatch_async(dispatch_get_main_queue(), ^{
[weakSelf _someHelper];
});
正确,在这种情况下并不总是需要它。在这种情况下,我们通常不会为这种句法噪音而烦恼。
如果是这样,dispatch_after
或者如果这个返回到主队列的调度被埋在某个异步调用中,那么有一个weakSelf
模式参数(所以你不会保持强引用超过可能需要的时间),但在你的简单示例中,立即调度到主队列,self
不需要弱引用。
话虽如此,在这里采用模式并没有错。weakSelf
只是没必要。
我心中的问题是,如果您要分派回主队列,这表明您正处于某个后台队列的耗时之中。在这种情况下,避免强烈提及self
可能是谨慎的做法。我们不能说没有看到您在哪里执行此代码的更广泛的上下文。
请注意,ARC(自动引用计数器)可能会导致强引用产生循环的情况。这样的循环会导致内存泄漏(引用计数器永远不会达到零)。在垃圾收集可用的语言中,gc 可以检测到这样的循环,并且内存将被释放。
现在弱指针防止创建强引用的永久循环。
给出的例子是为了说明这是否有必要。
在某些情况下,其他对象负责对象的生命周期,并且_someHelper
当来自其他对象的强裁判过期时(例如不再需要任何操作),应该阻止调用。在这种情况下,你需要弱自我。
在其他情况下,_someHelper
即使所有其他对象与该对象失去联系,您也需要执行保证,因此在这种情况下,您需要调度队列持有对对象的强引用。在这种情况下,弱自我已过时。