保留計數幾乎沒有用,詳情請參閱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
的第一個結果是2
不1
因爲返回值從arrayWithObjects
已經autoreleased但尚未實際發佈,因爲autorelease池尚未刷新(這通常發生在事件循環)。
第二個結果是2
,因爲mutableCopy
返回了一個保留對象,我們再次retain
。
第三個結果是1
,因爲我們發佈arr
,其保留計數爲2
。仍然沒有刷新autorelease池。
第四個結果是1
,因爲我們發佈了newArr
,其保留計數爲2
。
最終結果是1
,因爲我們泄漏了newArr
的內容併爲該變量分配了一個新的autoreleased數組。保留計數爲1
是尚未自動發佈的計數。
但是,保留計數不應被信任。瞭解內存管理規則(無論您是否使用ARC)。
看看http://whentouseretaincount.com – mttrb
好吧,看看它自己的儀器。 –
你在採訪我們嗎? –