0

我認爲下面第二個例子的結果應該是「null」,但是在我運行代碼之後,我發現例1中的輸出是「Strong-String」,例2中它是「null」爲什麼這個硬編碼的字符串沒有被釋放,而alloc/inited的呢?

我真的不明白這是爲什麼。

例子:

// property definition 
@property (nonatomic, strong) NSString *strongStr; 
@property (nonatomic, weak) NSString *weakString; 

// Sample 1 
self.strongStr = @"Strong-String"; 
self.weakString = self.strongStr; 
self.strongStr = nil; 
// output -> Strong-String 
NSLog(@"waekstring = %@", self.weakString); 

// Sample 2 
self.strongStr = [[NSString alloc] initWithUTF8String:"Strong-String"]; 
self.weakString = self.strongStr; 
self.strongStr = nil; 
// output -> null 
NSLog(@"waekstring = %@", self.weakString); 

回答

1

,當你這樣定義

// Sample 1 
self.strongStr = @"Strong-String"; 

字符串的編譯器實際上保持了靜態引用該字符串,如果您要創建具有相同的字母組成的字符串,會注意到兩個字符串的內存地址是相同的。編譯器在重複使用同一個字符串時可以幫助節省內存,因此每次都不必重新分配內存。這就是爲什麼字符串不會被取消分配,而手動分配/被加入的字符串的原因是

相關問題