[英]Avoiding the “capturing self strongly in this block is likely to lead to a retain cycle” message
每次我必须在块中使用全局var或属性,如下所示:
self.save = ^(){
if (isItSaving == NO) {
[self saveMyFile];
}
};
我必须重写这个
BOOL *iis = isItSaving;
id myself = self;
self.save = ^(){
if (iis == NO) {
[myself saveMyFile];
}
};
或者Xcode会抱怨“在这个区块中强烈捕捉自我可能会导致保留周期......
它甚至抱怨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];
}
};
......而且,是的,这是块的丑陋部分。
使用__unsafe_unretained typeof(self) weakSelf = self;
除了@ NikolaiRuhe的回复,在你的例子中声明属性
BOOL *iis = isItSaving;
id myself = self;
意味着strong
引用,所以使用__weak
self来阻止保留周期。 然后你可能想知道为什么你需要在块中声明一个弱__strong
self的__strong
引用,这是为了确保它在块的生命期内不会被释放,否则如果self
被释放, weakSelf->isItSaving
将会中断。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.