好吧,ARC上的这段代码在块中保持自我:
dispatch_async(someQ, ^{
[self doSomething];
});
可以通过
解决__weak MyRequest *weakSelf = self;
dispatch_async(someQ, ^{
[weakSelf doSomething];
});
但是如果doSomething有很多对自我的引用呢?因为doSomething代码会在块内运行,所以doSomething的所有代码都是直接在块上运行吗?
我是否需要将weakSelf传递给doSomething,以便该方法可以使用弱自引用而不是self?像
这样的东西__weak MyRequest *weakSelf = self;
dispatch_async(someQ, ^{
[weakSelf doSomethingUsingThisSelf:weakself];
});
答案 0 :(得分:1)
通过做:
MyRequest *__weak weakSelf = self;
dispatch_async(someQ, ^{
[weakSelf doSomething];
});
...当没有对self
的引用时,weakSelf
会自动变为nil
。因此异步回调最终会将doSomething
发送到nil
,即使对象在回调之前被销毁,也不会做任何事情。
如果weakSelf
不是nil,它只是指向对象的指针。将选择器发送到对象时,有两个隐式参数:self
和_cmd
(请参阅documentation for IMP),第6.1节)。因此weakSelf
成为这些调用中的隐式self
。此时,self
是一个强大的引用,因此在doSomething
调用链期间,对象不会从您下面被摧毁,但是从self
引用doSomething
不会导致引用计数增加,因为该块不知道doSomething
内部的内容。