避免"在此块中强烈捕获自我可能会导致保留周期"消息

Spa*_*Dog 11 cocoa cocoa-touch objective-c objective-c-blocks

每次我必须在块中使用全局var或属性,如下所示:

self.save = ^(){
  if (isItSaving == NO) {
      [self saveMyFile];
  }
};
Run Code Online (Sandbox Code Playgroud)

我必须重写这个

BOOL *iis = isItSaving;
id myself = self;

self.save = ^(){
  if (iis == NO) {
      [myself saveMyFile];
  }
};
Run Code Online (Sandbox Code Playgroud)

或者Xcode会抱怨"在这个区块中强烈捕捉自我可能会导致保留周期......

它甚至抱怨BOOL变量?

在块之前重新确定所有内容似乎是一个蹩脚的解决方案.

这是正确的方法吗?有优雅的方式吗?

这东西很难看.我正在使用ARC.

Nik*_*uhe 21

self在显式或隐式地从块内引用时才会出现此问题.访问全局变量时没有发出警告.

在你的情况下,你可能访问了一个(布尔)ivar.访问ivar隐式使用self,这就是编译器(正确地)警告您保留周期的原因.

修复保留周期的常用方法是:

typeof(self) __weak weakSelf = self;

self.save = ^() {
    typeof(weakSelf) __strong strongSelf = weakSelf;
    if (strongSelf != nil && ! strongSelf->isItSaving) {
        [strongSelf saveMyFile];
    }
};
Run Code Online (Sandbox Code Playgroud)

......而且,是的,这是块的丑陋部分.