关于iOS中的保留计数?

时间:2015-04-05 09:47:45

标签: ios objective-c

我正在对零售额进行一些简单的测试,我得到的只是-1。

例如,

 NSString *s1 = [[NSString alloc] init];
    NSLog(@"s1 Retain Count = %d",[s1 retainCount]);

    NSString *s2 = [NSString string];
    NSLog(@"s2 Retain Count = %d",[s2 retainCount]);

我想知道是否还有内部零售额?

2 个答案:

答案 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仪器(参见   仪器用户指南)可以跟踪对象分配和销毁。