2013-01-24 94 views
-6
NSArray *arr = [[NSArray arrayWithObjects:@"ag", @"sdfg", @"dgh", nil] retain]; 
NSArray *newArr = [[arr mutableCopy] retain]; 
[arr release]; 
[newArr release]; 
newArr = [NSArray arrayWithObject:@"sdfdhs"]; 

每行之後會保留什麼數目?請向我解釋這一點。感謝你...關於保留計數

+3

看看http://whentouseretaincount.com – mttrb

+1

好吧,看看它自己的儀器。 –

+3

你在採訪我們嗎? –

回答

1

保留計數幾乎沒有用,詳情請參閱http://whentouseretaincounts.com

不過,我加入呼籲retainCount你的代碼並運行以下:

NSArray *arr = [[NSArray arrayWithObjects:@"ag", @"sdfg", @"dgh", nil] retain]; 
NSLog(@"%ld", [arr retainCount]); 

NSArray *newArr = [[arr mutableCopy] retain]; 
NSLog(@"%ld", [newArr retainCount]); 

[arr release]; 
NSLog(@"%ld", [arr retainCount]); 

[newArr release]; 
NSLog(@"%ld", [newArr retainCount]); 

newArr = [NSArray arrayWithObject:@"sdfdhs"]; 
NSLog(@"%ld", [newArr retainCount]); 

,並得到了以下結果:

2013-01-24 15:45:56.840 Untitled 2[96774:707] 2 
2013-01-24 15:45:56.842 Untitled 2[96774:707] 2 
2013-01-24 15:45:56.842 Untitled 2[96774:707] 1 
2013-01-24 15:45:56.843 Untitled 2[96774:707] 1 
2013-01-24 15:45:56.843 Untitled 2[96774:707] 1 

的第一個結果是21因爲返回值從arrayWithObjects已經autoreleased但尚未實際發佈,因爲autorelease池尚未刷新(這通常發生在事件循環)。

第二個結果是2,因爲mutableCopy返回了一個保留對象,我們再次retain

第三個結果是1,因爲我們發佈arr,其保留計數爲2。仍然沒有刷新autorelease池。

第四個結果是1,因爲我們發佈了newArr,其保留計數爲2

最終結果是1,因爲我們泄漏了newArr的內容併爲該變量分配了一個新的autoreleased數組。保留計數爲1是尚未自動發佈的計數。

但是,保留計數不應被信任。瞭解內存管理規則(無論您是否使用ARC)。