我想在AppDelegate
类的didFinishLaunchingWithOptions
方法中打印NSString
的保留计数
NSString *str = [[NSString alloc] init];
NSLog(@"str retain count %d",[str retainCount]);
但它总是给出-1而不是+1....为什么?
我想在AppDelegate
类的didFinishLaunchingWithOptions
方法中打印NSString
的保留计数
NSString *str = [[NSString alloc] init];
NSLog(@"str retain count %d",[str retainCount]);
NSUIntegerMax
表示返回的对象是不会被释放的。这个信息曾经在文档中出现过,但现在已经被删除了(因为非常不鼓励使用-retainCount
)。
在MRC中,有些人会重写-retainCount
以防止他们的单例被释放。
在这种情况下,[[NSString alloc] init]
可以逻辑上优化为返回一个常量或不会被释放的对象,而不是为每个请求创建一个空字符串。当然,在你的程序中不应该依赖于这个细节和行为。
Apple文档指出:
特别考虑
这种方法在调试内存管理问题上没有价值。因为任何数量的框架对象可能已经保留了一个对象以持有对它的引用,同时自动释放池可能正在保留对象上的任意数个延迟释放,所以你很难从这种方法中获得有用的信息。
因此,你不应该指望它的正确性。
另外,-1
实际上是最大的无符号整数,而不是负值。保留计数返回NSUInteger
,因此您应该使用%u
而不是%d
。
编辑: 顺便提一下,由于NSConstantString
是NSString
的子类,因此它必须实现NSString
实现的方法,包括-retainCount
。这就是为什么您实际上可以在常量字符串对象上调用-retainCount
方法(以及为什么Apple使其返回一个特殊值)。这种继承关系可以在NSString.h
头文件的底部找到。