【问题标题】:When is reference to self in block a retain cycle?何时在块中引用 self 是一个保留周期?
【发布时间】:2014-02-26 17:10:42
【问题描述】:

我遇到了一个可能相当普遍的问题。在 ARC 环境中,需要引用 self 的块将比 self 寿命长。我知道在块中使用__weak typeof(self) weakSelf = self; 以避免保留周期的约定。问题是我们确实需要保留自我。所以我的问题是:块中对 self 的引用何时创建保留周期? This post post 建议在动画块中,引用 self 是可以的。

我也考虑过类似以下的解决方案,但不确定它会改变什么:

__block typeof(self) blockSelf = self;

[someObj someMethodTakingCallback:^{
    //do some stuff
    blockSelf = nil;
 }];  

【问题讨论】:

    标签: ios objective-c automatic-ref-counting objective-c-blocks


    【解决方案1】:

    如果 self 除了保留 `self 的块之外还保留了该块,您将获得一个引用循环。

    【讨论】:

    • 我猜那么问题就变成了“self什么时候保留块?”我假设在上面的示例中 - 将块传递给另一个对象以执行 - 它不是。对吗?
    • 如果没有看到更多范围,您发布的代码不应导致 self 保留该块。
    【解决方案2】:

    在这种情况下,如果 self 持有对 someObj 的引用,您将有一个保留循环,因为 someObj 可能持有对 self 的引用。如果有从self到someObj的任何保留引用路径,这实际上是一个保留循环。

    【讨论】:

    • 如果self 持有对someObj 的引用,你为什么说someObj 可能持有对self 的引用。这没有任何意义。
    • someObj 持有对块的引用(这是可能的引用,我们不能仅根据我们在这里看到的内容来确定)该块肯定持有对自身的引用。因此 someObj 可能持有对 self 的(间接)引用。
    • 如果除了从 someObj 到 self 的间接引用之外,还有一条从 self 到 someObj 的保留路径(例如,如果 someObj 实际上是自我
    • someObj 在我的例子中持有对块的引用。但是 self 没有持有对块的引用,也没有持有对 someObj 的引用
    • @David 为什么说sombeObj 持有对区块的引用?它不是。你为什么说这个区块持有对self的引用?它不是(至少据我们所知)。
    猜你喜欢
    • 2015-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-07
    • 1970-01-01
    相关资源
    最近更新 更多