图片解释了问题(这并不荒谬??!)
首先,该-retainCount
方法返回一个无符号整数,因此根据定义,它不能为负数。您以错误的形式打印它,因为您错误地认为它是有符号整数。它实际上是NSUIntegerMax
。
二-retainCount
是一般用处不大。甚至文档都说:
不要使用这种方法。(必需的)
...
这种方法在调试内存管理问题时没有任何价值。因为任何数量的框架对象可能已经保留了一个对象以保存对它的引用,而同时自动释放池可能在一个对象上保存了任何数量的延迟释放,所以您不太可能从中获得有用的信息方法。
第三,类可以覆盖-retainCount
并返回一些自定义的东西。这通常在具有自定义内存管理特性的类中完成,这不能用保留计数很好地描述。这就是这种情况,因为来自字符串文字的字符串对象是静态分配的,并且在程序的整个生命周期中都存在。它们不是内存管理的。因此,它们返回一个虚假的保留计数NSUIntegerMax
。