如果在块中引用 self,为什么这不是一个保留循环?
Why is this not a retain cycle if self is referred to within a block?
@interface myViewController ()
@property (nonatomic, copy) NSString* (^translateKey)(NSString *);
@property (nonatomic, copy) NSString *aString;
@end
案例#1
@implementation
-(void)viewDidLoad {
_translateKey = ^NSString*(NSString* translationKey){
return _aString;
};
}
@end
- 编译器抱怨 #1 是保留循环。我明白这一点
案例#2
@implementation
-(void)viewDidLoad {
NSString * (^translationKeyBlock)(NSString *) = ^NSString*(NSString* translationKey){
return _aString;
};
_translateKey = translationKeyBlock;
}
- 编译器不会抱怨案例#2。但这仍然是一个保留周期,对吗?
我猜你的问题是:
@implementation
-(void)viewDidLoad {
NSString * (^translationKeyBlock)(NSString *) = ^NSString*(NSString* translationKey){
return _aString;
};
_translateKey = translationKeyBlock;
}
它仍然是一个保留循环,但编译器不会抱怨。
如果直接将块设置为_translateKey,编译器会发现这一行会产生一个保留循环并抛出错误或警告。
但是,编译器将不确定您是否先将块设置为局部变量。这就是为什么 第一行 没有抱怨错误。
局部变量translationKeyBlock的值可以在执行前随时更改
_translateKey = translationKeyBlock;
可能是因为编译器在写代码的时候无法检查translationKeyBlock的值。(我不确定100%。)
希望对您有所帮助
情况2还是循环?是
为什么错过了?编译器的流分析没有捕捉到这种情况,这在这种情况下有点令人惊讶(优化器肯定可以省略 translationKeyBlock
将情况 2 减少到情况 1)。
你应该怎么办?将其作为 "enhancement request" 或通过 bugreporter.apple.com 直接 "bug" 提交给 Apple。他们可能会以一个很好的理由回来,他们没有抓住它,或者他们可能会在未来支持它。 (这不是我看到的第一个流量分析问题。)
@interface myViewController ()
@property (nonatomic, copy) NSString* (^translateKey)(NSString *);
@property (nonatomic, copy) NSString *aString;
@end
案例#1
@implementation
-(void)viewDidLoad {
_translateKey = ^NSString*(NSString* translationKey){
return _aString;
};
}
@end
- 编译器抱怨 #1 是保留循环。我明白这一点
案例#2
@implementation
-(void)viewDidLoad {
NSString * (^translationKeyBlock)(NSString *) = ^NSString*(NSString* translationKey){
return _aString;
};
_translateKey = translationKeyBlock;
}
- 编译器不会抱怨案例#2。但这仍然是一个保留周期,对吗?
我猜你的问题是:
@implementation
-(void)viewDidLoad {
NSString * (^translationKeyBlock)(NSString *) = ^NSString*(NSString* translationKey){
return _aString;
};
_translateKey = translationKeyBlock;
}
它仍然是一个保留循环,但编译器不会抱怨。
如果直接将块设置为_translateKey,编译器会发现这一行会产生一个保留循环并抛出错误或警告。 但是,编译器将不确定您是否先将块设置为局部变量。这就是为什么 第一行 没有抱怨错误。
局部变量translationKeyBlock的值可以在执行前随时更改 _translateKey = translationKeyBlock;
可能是因为编译器在写代码的时候无法检查translationKeyBlock的值。(我不确定100%。)
希望对您有所帮助
情况2还是循环?是
为什么错过了?编译器的流分析没有捕捉到这种情况,这在这种情况下有点令人惊讶(优化器肯定可以省略 translationKeyBlock
将情况 2 减少到情况 1)。
你应该怎么办?将其作为 "enhancement request" 或通过 bugreporter.apple.com 直接 "bug" 提交给 Apple。他们可能会以一个很好的理由回来,他们没有抓住它,或者他们可能会在未来支持它。 (这不是我看到的第一个流量分析问题。)