簡體   English   中英

如果在塊內引用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。 但這仍然是一個保留周期嗎?

案例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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM