为什么在块内使用 self 时 Xcode 有时会抱怨而不是总是抱怨?

Why does Xcode complain sometimes and not always when self is used inside a block?

假设以下情况:

  self.collectionViewController.didEndDisplayingCell = ^(CollectionViewCell *cell) {
    [self doSomething];    
  };

Xcode 会抱怨我不能在该方法中使用 self 否则我将有一个保留周期。

然后是另一种情况。我创建了一个 class 来加载图像并在完成时运行一些东西,并将其命名为

[[MyImageClass sharedInstance] loadImageFromUrl:url
                             runOnCompletion:^(UIImage *image) {
                               [self doSomething];
                             }];

Xcode 在这种情况下不会抱怨,并且 self 在块内使用!

为什么?

第一种情况:

self 对象保持对块对象的强引用。

反之亦然,block of 也保留 self 对象。 Since blocks capture their context, package it up, and carry it along for the ride, any reference to self (or implicit reference with an ivar) within a block also will capture a strong reference to self。你可以参考这个https://blackpixel.com/writing/2014/03/capturing-myself.html

所以,这将是保留周期!