这会在一个街区内保持自我吗?

时间:2014-12-05 23:59:52

标签: objective-c memory-management automatic-ref-counting

好吧,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];
});

1 个答案:

答案 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内部的内容。