我们何时应该将弱自我变成强自我?

无夜之*_*之星辰 4 block objective-c

我知道当我们使用块时,我们应该使用weakSelf来避免保留周期。但是我看到有时在块中有一个strongSelf。

让我感到困惑的是:

  1. 为什么必须将弱自我变成强自我?
  2. 如果我们不将weakSelfSelf更改为strongSelf,将会发生什么可怕的事情?
  3. 我们什么时候应该将弱自我变成强自我?

希望有人能给出一个确切的例子。

提前致谢。

Poc*_*chi 7

  1. 为什么必须将弱自我变成强自我?

有时,如果您对self的引用已经为nil(用户关闭了视图),则您希望您的块不执行。这就是为什么您首先使用弱引用的原因。(常见情况)

但是,有时您希望您的块完成执行以确保其引用的所有内容都处于活动状态,但前提是一旦该块启动后 “ self”仍处于活动状态。在这种情况下,使该块将弱引用转换为强引用。(稀有案例)

  1. 如果我们不将weakSelfSelf更改为strongSelf,将会发生什么可怕的事情?

如果该块在self处于活动状态(允许它开始)时开始执行,但在处理过程中被释放(考虑诸如图像处理之类的耗时功能),则该块从self存取资源(不再访问它)存在)将崩溃。

  1. 我们什么时候应该将弱自我变成强自我?

几乎从不。我能想到的唯一例子是,一旦您的块开始执行,它绝对需要“自身”的资源。

在此答案中有更详细的解释:

在块中强引用,会保留吗?


CRD*_*CRD 7

self在块中捕获作为弱引用或强引用的唯一原因是因为该块以某种方式使用它

何时self被弱捕获如何使用它将决定何时以及是否需要首先制作强副本。

如果块要多次使用捕获的引用,则应始终制作强副本,这可确保引用在块内的所有使用中保持活动状态,并避免多次加载弱引用的成本。

例如,如果块的功能取决于是否self仍然存在,那么通常首先进行强引用并对其进行测试。类似的东西:

__weak __typeof(self)weakSelf = self;
myBlock = ^{
    // make local strong reference to self
    __typeof(weakSelf) strongSelf = weakSelf; 
    // check if self still exists and process accordingly
    if (strongSelf)
    {
        // do whatever is needed if "self" still exists
        // strongSelf will keep the object alive for the
        // duration of the call
    }
    else
    {
        // do whatever, if anything, is needed if "self" no longer exists
    }
});
Run Code Online (Sandbox Code Playgroud)

但是,如果块的操作只是可选地需要使用所引用的对象,self则可能永远不会进行强副本。

HTH