2011-12-01 29 views
1

这是retaincount代码。为什么NSNumber错误算作retaincount?

#import <Foundation/Foundation.h> 

int main (int argc, const char * argv[]) 
{ 

    @autoreleasepool { 

     NSNumber *number = [[NSNumber alloc]initWithInt:10]; 
     NSMutableArray *array = [[NSMutableArray alloc]initWithCapacity:0]; 

     NSLog(@"retain count : %d",[number retainCount]); 

     [array addObject:number]; 
     NSLog(@"retain count : %d",[number retainCount]); 

     [number release]; 
     NSLog(@"retain count : %d",[number retainCount]); 

     [number release]; 
     NSLog(@"retain count : %d",[number retainCount]); 

     [number release]; 
     NSLog(@"retain count : %d",[number retainCount]); 
    } 
    return 0; 
} 

我预期的答案是

retain count : 1 
retain count : 2 
retain count : 1 
retain count : 0 
and then error 

但实际运行结果如下。

[Switching to process 6363 thread 0x0] 
2011-12-01 19:39:53.843 nsnumber[6363:707] retain count : -1 
2011-12-01 19:39:53.846 nsnumber[6363:707] retain count : -1 
2011-12-01 19:39:53.847 nsnumber[6363:707] retain count : -1 
2011-12-01 19:39:53.847 nsnumber[6363:707] retain count : -1 
2011-12-01 19:39:53.848 nsnumber[6363:707] retain count : -1 

我无法理解这个结果。

为什么会出现这样的结果?

回答

1

关于retainCount

这种方法通常是没有价值的调试内存管理 问题。因为任何数量的框架对象可能保留了一个对象以保存对其的引用,同时 自动释放池可能在 对象上保存任意数量的延迟发布,所以很可能无法获得有用的信息来自 这种方法。

参见

http://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html#//apple_ref/occ/intfm/NSObject/retainCount

When to use -retainCount?

3

不要相信保留计数的值。特别是当你使用ARC时!按照规则。就这样。

+0

+1含义是你不能在ARC中使用retainCount。 http://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/_index.html – JeremyP

+0

AFAIK,这甚至不会在ARC下编译;使用'retainCount'会引发错误。 –

3

NSNumber返回某些数字的单例实例(我相信整数1至12,或其他)。

您不应该依赖retainCount的值。整个代码或框架代码中可能会发生任何数量的事情,这些代码可能会更改保留计数。

1

retainCount的返回类型是NSUInteger;这是一个未签名的整数。 string format specifier%d是针对整数的符号

Cocoa使用NSUIntegerMax来表示永远不会释放的永久物体的保留计数。出于性能方面的原因,它缓存并重用代表小整数的对象NSNumber,您创建的这个对象显然是其中之一,并且是不朽的。

当您将最大无符号整数值解释为好像它已被签名(在two's complement arithmetic下)时,它看起来是-1。

要查看“true”值,应使用说明符%lu,如上面链接的图表I所示。

但是,您一般shouldn't rely on retainCount to give you any useful information。这is documented

因为任何数量的框架对象的可能,以便保持对它的引用,而在同一时间自动释放池可以保持物体上的任何数量的推迟发布的保留了一个对象,它是非常你不太可能从这个方法中获得有用的信息。

as beryllium already noted