如何找到保留计数?

Posted

技术标签:

【中文标题】如何找到保留计数?【英文标题】:How to find the Retain count? 【发布时间】:2011-10-17 17:05:20 【问题描述】:

请解释一下下面的代码行,我只是困惑..,

Nsstring *a;
Nsstring *b;

a = [b retain];

a & b 的保留计数是多少。

a = [b copy];

a & b 的保留计数是多少。

提前致谢。

【问题讨论】:

【参考方案1】:

从技术上讲,您发布的情况下的保留计数是不确定的,因为您从未初始化变量。在未初始化的指针上调用retain 可能会崩溃。

其次,您的情况下的保留计数取决于您如何初始化变量。

NSString *a;
NSString *b = @"test";

a = [b retain];

/* Both variables reference the same object which has been retained.
   Retain count +1 
 */

NSString *a;
NSString *b = @"test 2";

a = [b copy];

/* `a` has a retain count +1 (a variable returned from a `copy`
   method has a retain count +1). `b` retain count does not change 
   (you haven't called `retain` on `b`, so it's count remains the
   same.
 */

如果您还没有这样做,您应该阅读Apple's memory management guidelines。此外,除非您有充分的理由不这样做,否则您应该使用ARC,这样您就可以摆脱手动管理内存的大部分麻烦。


在另一个答案的 cmets 中,您询问如何确定对象的保留计数。你总是自己跟踪它。其他对象可能会保留和释放您的字符串,但您不在乎。如果您使用alloc 创建和对象,在对象上调用retaincopy 对象,您有责任在完成后释放或自动释放该对象。否则不是你的责任。对象的绝对保留计数无关紧要。

【讨论】:

感谢您的示例和非常有趣的解释,我现在知道我问了什么。 释放一个对象重要吗,如果不释放会是什么情况? @kubi 你真的运行你的程序了吗? NSString 做了很多疯狂的优化。您示例中的retainCount 都返回NSUInteger 中允许的最大整数。这就是为什么您不应该使用任何对象的retainCount 的另一个原因。 @Yuji。是啊,你说得对。我以更抽象的方式使用“保留计数”。 如果您要转而只讨论保留计数的增量,那么其中的愚蠢实现细节并不重要......您担心平衡保留与发布,并且,除此之外,保留计数无关紧要。【参考方案2】:

NSString 没有有意义的保留计数。但是,如果您将其用作一般示例,则查找具有正常保留计数的对象的保留计数的方法是:

[a retainCount]

【讨论】:

你永远不应该使用retainCount。这是一个实现细节,对任何实际应用几乎没有用处。 而且你永远不应该在真正的程序中调用retainCount(这是一个非常确定的迹象,你做错了什么。) 我更新了我的答案,但简而言之:你不在乎保留计数是多少。 @Dani 它对调试内存问题非常不利...使用僵尸来调试这些问题,而不是保留计数! @Dani:查看保留计数对于调试不是非常好,因为它们为您提供了一个非常不完整且很可能具有误导性的对象内存管理图。如果您需要查看保留计数,通常是因为您做错了其他事情。 retainCount 上的文档甚至包括一个大注释,开头是:“重要提示:此方法通常在调试内存管理问题时没有任何价值。”

以上是关于如何找到保留计数?的主要内容,如果未能解决你的问题,请参考以下文章

查找保留特定对象的对象

如何增加 NSString 类型变量的保留计数? [复制]

如何使用保留订单的运行计数形成查询

如何在 MySQL 中为行保留一个计数器

SAS - 从带有科学计数法数字的csv文件导入时如何保留实际数字

为啥在启用 ARC 的项目中不需要维护保留计数