2

当我使用NSArrayNSString对象记录保留计数时,我的行为不均匀。 看下面的代码,

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

代码有什么问题??

谢谢

普拉蒂克·戈斯瓦米

4

4 回答 4

7

2147483647 没问题

2147483647 是 INT_MAX。INT_MAX 是字符串文字的保留计数(即代码中定义的 @"foo" 字符串)。这意味着他们永远不会被释放。

顺便说一句,不要使用retainCount。

于 2011-03-01T14:39:39.933 回答
6

你永远不应该使用-retainCount,因为它永远不会告诉你任何有用的东西。Foundation 和 AppKit/UIKit 框架的实现是不透明的;你不知道要保留什么,为什么要保留,谁在保留,什么时候保留等等。

另请参阅:StackOverflow | 何时使用retainCount可以很好地说明为什么不使用retainCount。

并回应 Dave DeLong:请大家访问http://bugreport.apple.com并请求-retainCount弃用。要求的人越多越好。

于 2011-03-01T15:07:47.090 回答
4

retainCount 返回 NSUInteger 并且您应该以这种方式打印它...

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

%d 用于有符号的 32 位整数 (int)。NSUInteger 在 32 位平台上定义为 unsigned int,在 64 位平台上定义为 unsigned long。上面的例子对于两个 32/64 位平台都是安全的。

于 2011-03-01T14:18:29.033 回答
4

代码有什么问题??

您正在调用retainCount。

retainCount对调试几乎没有用处,永远不应该在生产代码中使用。对象的保留计数是一个内部实现细节,通常具有深不可测的值。

于 2011-03-01T16:40:38.023 回答