[英]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
案例#2
@implementation
-(void)viewDidLoad {
NSString * (^translationKeyBlock)(NSString *) = ^NSString*(NSString* translationKey){
return _aString;
};
_translateKey = translationKeyBlock;
}
案例2仍然是一個循環? 是
為什么錯過了? 編譯器的流分析沒有捕捉到這種情況,在這種情況下這有點令人驚訝(優化者肯定會忽略translationKeyBlock
將案例2簡化為案例1)。
你該怎么辦? 將其作為“增強請求”提交給Apple,或者通過bugreporter.apple.com將其提交給普通的“bug”。 他們可能會因為他們沒有抓住它而回來,或者他們將來可能會支持它。 (這不是我見過的第一個流量分析問題。)
我認為你的問題是:
@implementation
-(void)viewDidLoad {
NSString * (^translationKeyBlock)(NSString *) = ^NSString*(NSString* translationKey){
return _aString;
};
_translateKey = translationKeyBlock;
}
它仍然是一個保留周期,但編譯器不會抱怨。
如果直接將塊設置為_translateKey,編譯器將發現此行將進行保留循環並拋出錯誤或警告。 但是,編譯器不會確定您是否先將塊設置為局部變量。 這就是為什么第一行沒有抱怨錯誤。
在執行_translateKey = translationKeyBlock之前,可以隨時更改局部變量translationKeyBlock的值;
也許原因是編譯器在編寫代碼時無法檢查translationKeyBlock的值。(我不確定100%。)
我希望這可以幫到你。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.