2014-01-16 40 views
1

我想了解__weak如何在ARC代碼中工作。 這是我的例子:__示例在ARC代碼

NSString *string = @"Hi!"; //1 
__weak NSString *secondString = string; //2 
string = @"Hello world!"; //3 

NSLog(@"STR: %@", secondString); //4 

我期望的NSLog顯示我「無」,但它顯示「你好!」。 爲什麼?這個字符串必須在第三行處理。

回答

4

這樣的字符串是靜態的,永遠不會被釋放。嘗試用手動分配的對象:

#import <Foundation/Foundation.h> 

int main() 
{ 
    NSObject* strongPtr = [NSObject new]; 
    NSObject* __weak weakPtr = strongPtr; 
    NSLog(@"weak=%@", weakPtr); 

    strongPtr = nil; 
    NSLog(@"weak=%@", weakPtr); 
} 

輸出應該

2014-01-16 15:07:49.376 a.out[34078:507] weak=<NSObject: 0x7fe391c08230> 
2014-01-16 15:07:49.379 a.out[34078:507] weak=(null) 

爲什麼像這樣的測試可能會出現失敗的另一個常見原因是自動釋放池 - 如果任何API的自動釋放幕後的對象,您可能必須等到事件循環的下一個躍點才能看到弱指針變爲nil

+2

特別是,僅僅讀取一個弱變量可能會導致該值被本地自動釋放池保留。 –

4

常量字符串是瞭解ARC的不好方法。記錄是瞭解ARC的一種不好的方式。

常量字符串是有效的單身人士,永遠不會被釋放。

日誌記錄以您不知道的方式捕獲變量。

調試版本不立即刪除弱引用。

本質上,你不能在像這樣的獨立函數中對ARC進行很少的「測試」。