我正在对零售额进行一些简单的测试,我得到的只是-1。
例如,
NSString *s1 = [[NSString alloc] init];
NSLog(@"s1 Retain Count = %d",[s1 retainCount]);
NSString *s2 = [NSString string];
NSLog(@"s2 Retain Count = %d",[s2 retainCount]);
我想知道是否还有内部零售额?
答案 0 :(得分:3)
NSLog(@"s1 Retain Count = %lu",(unsigned long)[s1 retainCount]);
如果您使用了正确的格式说明符 - 警告应该告诉您这样做 - 您会看到
retaincoundt[11169:438727] s1 Retain Count = 18446744073709551615
retaincoundt[11169:438727] s2 Retain Count = 18446744073709551615
或2 64 - 1 - > 64位系统上的NSUIntegerMax。你正在寻找一个恒定的对象。编译器通过指向同一个永远存在的常量不可变对象来确定优化空间。
这些事情可能随时发生或不发生。你不能也不应该依赖retainCount
。
答案 1 :(得分:0)
Take a look at the Apple Doc's..
宣言目标-C - (NSUInteger)retainCount返回值接收者的引用计数。
特殊注意事项此方法在调试内存时没有任何价值 管理问题。因为任何数量的框架对象都可能有 保留一个对象,以便保持对它的引用,而在 同时自动释放池可能持有任何数量的延迟 在一个对象上发布,你不太可能获得有用的东西 这种方法的信息。
要了解内存管理的基本规则,您必须这样做 遵守,阅读内存管理政策。诊断内存管理 问题,使用合适的工具:
Clang Static分析仪通常可以找到内存管理 甚至在你运行你的程序之前就会出现问题。
Instruments应用程序中的Object Alloc仪器(参见 仪器用户指南)可以跟踪对象分配和销毁。