关于NSString引用计数的许多问题

时间:2016-06-23 08:21:07

标签: ios objective-c nsstring

我在Objective-C中有一些关于Mannul引用计数的测试。 我在下面运行以下代码:

2016-06-23 16:15:50.490 text[38147:3406036] NSData: 18446744073709551615
2016-06-23 16:15:50.491 text[38147:3406036] NSMutableData: 1
2016-06-23 16:15:50.491 text[38147:3406036] NSObject: 1
2016-06-23 16:15:50.491 text[38147:3406036] NSString: 18446744073709551615
2016-06-23 16:15:50.491 text[38147:3406036] NSStinrg: 1
2016-06-23 16:15:50.491 text[38147:3406036] 0x10359d160
2016-06-23 16:15:50.491 text[38147:3406036] 0x10359d160

控制台:

NSData

我想知道为什么NSStringUINT_MAX的引用计数为initWithFormat( - 1),而b2会使a添加计数?为什么bFoo的地址相同?

很多。

2 个答案:

答案 0 :(得分:2)

空的不可变NSDatas对单个实例是唯一的,无法保留或释放(由UINT_MAX-1引用计数表示)。对于NSString,%@被替换为对象上调用-description的结果,并且NSString的-description方法返回self。所以你在那里得到一个恒定的NSString文字,这同样不是可以保留或释放的东西。常量字符串也是唯一的,所以在编译时你的二进制文件中嵌入了一个字符串,并且没有进行任何分配。

答案 1 :(得分:2)

来自apple docs

- (NSUInteger)retainCount
  

此方法在调试内存管理问题时没有任何价值。   因为任何数量的框架对象都可能保留了一个对象   为了保持对它的引用,同时自动释放   池可能在一个对象上持有任意数量的延迟版本   你不太可能从这种方法中获得有用的信息。