2011-03-01 171 views
2

當我記錄與NSArrayNSString對象保留計數,我有不平衡的行爲。 請參見下面的代碼,奇怪的行爲與retainCount

NSArray *aryTemp = [NSArray arrayWithObjects:@"One",nil]; 
NSLog(@"Retain Count :%d",[aryTemp retainCount]); 

NSArray *aryTemp2 = [[NSArray alloc] initWithObjects:@"One",nil]; 
NSLog(@"Retain Count :%d",[aryTemp2 retainCount]); 

NSString *strTemp = @"One"; 
NSLog(@"Retain Count :%d",[strTemp retainCount]); 

NSString *strTemp2 = [[NSString alloc] initWithString:@"One"]; 
NSLog(@"Retain Count :%d",[strTemp2 retainCount]); 

,這是輸出我得到

2011-03-01 19:19:32.410 Test[14607:207] Retain Count :37 
2011-03-01 19:19:32.412 Test[14607:207] Retain Count :1 
2011-03-01 19:19:32.413 Test[14607:207] Retain Count :2147483647 
2011-03-01 19:19:32.413 Test[14607:207] Retain Count :2147483647 

什麼是錯誤的代碼?

感謝

PRATIK哥斯瓦米

回答

6

你永遠不應該使用-retainCount,因爲它永遠不會告訴你任何有用的東西。 Foundation和AppKit/UIKit框架的實現是不透明的;你不知道保留什麼,爲什麼保留,誰保留,保留時間等等。

另請參閱:StackOverflow | when to use retainCount瞭解您爲什麼不使用retainCount的優秀重述。

並回顯Dave DeLong: 請大家去http://bugreport.apple.com並要求-retainCount被棄用。要求的人越多越好。

4

retainCount返回NSUInteger,你應該以這種方式打印出來......

NSLog(@"%lu", (unsigned long)[blabla retainCount]); 

%d用於簽名的32位整數(INT)。 NSUInteger在32位平臺上定義爲unsigned int,在64位平臺上定義爲unsigned long。上面的例子對32/64位平臺都是安全的。

7

沒有錯2147483647

2147483647是INT_MAX。 INT_MAX是字符串文本的保留字(即在代碼中定義的@「foo」字符串)。這意味着他們永遠不會被釋放。

btw,不要使用retainCount。

+0

我想再說一遍:使用'retainCount'不是一個好主意,因爲它是一個實現細節,特別是單例和靜態對象會給你任意值的保留計數(儘管大部分時間是簡單地INT_MAX)。 – DarkDust 2011-03-01 14:48:43

+0

好的,但爲什麼我有NSArray的垃圾值?我得到的保留數 - 37.爲什麼是這樣? – 2011-03-02 04:48:52

+0

你怎麼知道37是垃圾值?這正是你不應該使用retainCount的原因。 – 2011-03-02 07:20:41

4

代碼有什麼問題?

您正在致電retainCount。

retainCount幾乎不用於調試,永遠不應該用於生產代碼。對象的保留計數是一個內部實現細節,通常具有不可估量的值。