每次我必须在块内使用全局变量或属性时,如下所示:
self.save = ^(){
if (isItSaving == NO) {
[self saveMyFile];
}
};
我必须像这样重写
BOOL *iis = isItSaving;
id myself = self;
self.save = ^(){
if (iis == NO) {
[myself saveMyFile];
}
};
或者 Xcode 会抱怨“在这个块中强烈捕获 self 可能会导致保留周期......
它甚至抱怨 BOOL 变量?
在块之前重新声明所有内容似乎是一个蹩脚的解决方案。
这是正确的方法吗?有优雅的方法吗?
这东西很难看。我正在使用ARC。
该问题仅在引用时出现self
从块内显式或隐式地进行。访问全局变量时不会发出警告。
在你的情况下,你可能访问了一个(布尔)ivar。隐式访问 ivar 使用self
,这就是编译器(正确地)警告您有关保留周期的原因。
修复保留周期的常见方法是:
typeof(self) __weak weakSelf = self;
self.save = ^() {
typeof(weakSelf) __strong strongSelf = weakSelf;
if (strongSelf != nil && ! strongSelf->isItSaving) {
[strongSelf saveMyFile];
}
};
...而且,是的,这是街区中有点难看的部分。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)