奇怪的行为与retainCount
问题描述:
当我记录与NSArray
和NSString
对象保留计数,我有不平衡的行为。 请参见下面的代码,奇怪的行为与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哥斯瓦米
答
你永远不应该使用-retainCount
,因为它永远不会告诉你任何有用的东西。 Foundation和AppKit/UIKit框架的实现是不透明的;你不知道保留什么,为什么保留,谁保留,保留时间等等。
另请参阅:StackOverflow | when to use retainCount了解您为什么不使用retainCount的优秀重述。
并回显Dave DeLong: 请大家去http://bugreport.apple.com并要求-retainCount
被弃用。要求的人越多越好。
答
retainCount返回NSUInteger,你应该以这种方式打印出来......
NSLog(@"%lu", (unsigned long)[blabla retainCount]);
%d用于签名的32位整数(INT)。 NSUInteger在32位平台上定义为unsigned int,在64位平台上定义为unsigned long。上面的例子对32/64位平台都是安全的。
答
没有错2147483647
2147483647是INT_MAX。 INT_MAX是字符串文本的保留字(即在代码中定义的@“foo”字符串)。这意味着他们永远不会被释放。
btw,不要使用retainCount。
答
代码有什么问题?
您正在致电retainCount。
retainCount
几乎不用于调试,永远不应该用于生产代码。对象的保留计数是一个内部实现细节,通常具有不可估量的值。
我想再说一遍:使用'retainCount'不是一个好主意,因为它是一个实现细节,特别是单例和静态对象会给你任意值的保留计数(尽管大部分时间是简单地INT_MAX)。 – DarkDust 2011-03-01 14:48:43
好的,但为什么我有NSArray的垃圾值?我得到的保留数 - 37.为什么是这样? – 2011-03-02 04:48:52
你怎么知道37是垃圾值?这正是你不应该使用retainCount的原因。 – 2011-03-02 07:20:41