2011-03-01 124 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几乎不用于调试,永远不应该用于生产代码。对象的保留计数是一个内部实现细节,通常具有不可估量的值。