Swift:如何记录对象的保留计数?

31

有没有一种快速将对象的保留计数记录到Xcode控制台中的方法? 如果没有,下一个最好的选择是什么?


6
为什么需要retainCount? - Midhun MP
2
仅作为教学工具。我想向学生展示强引用循环如何发生,并谈论整个ARC的事情。 - sirab333
1
在使用 retainCount 方法之前,请先阅读以下内容: [10(http://whentouseretaincount.com), [2](https://dev59.com/4G445IYBdhLWcg3w6eXz), [3](http://www.friday.com/bbum/2011/12/18/retaincount-is-useless/), [4](https://dev59.com/rG025IYBdhLWcg3wzpWK),[5 Apple 上对 retainCount 方法的解释](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/#//apple_ref/occ/intfm/NSObject/retainCount) 。 - Midhun MP
1
@sirab333 retainCountCFGetRetainCount() 没有任何区别。用盒子和线条画出对象图形是教授关于循环的更好方法;保留计数是无意义的。 - bbum
18
伙计们,我们可以放弃清教主义。如果他想要retainCount,那就给他retainCount。他为什么要它其实不关你的事。他并没有要求最佳内存管理实践。 - Womble
显示剩余2条评论
4个回答

61

3
请注意,在Swift中,CFRetainCount计算的也包括“未知”类型的引用,这可能包括弱引用。通过将运行时的CFGetRetainCount值与Xcode的“查看内存图层次结构”工具进行交叉参考,我了解到了这一点。更多信息请参见:https://koenig-media.raywenderlich.com/uploads/2017/08/visual_memory_debugger.png - AtomicBoolean

3

2
retainCount 在 Swift 中不好用。另外,查看文档中的“特殊注意事项”: “此方法在调试内存管理问题时没有价值。因为任何数量的框架对象都可能保留了一个对象以便持有对它的引用...” 你会如何在 Instruments 中处理? - sirab333
不要指望 retainCount 给你精确的值。请参考我在评论中附加的链接(问题部分)。 - Midhun MP

0

除了使用CFGetRetainCount,您也可以使用_getRetainCount_getRetainCount的优点如下:

  1. _getRetainCount作为Swift标准库的一部分可用,因此您不必依赖于Foundation
  2. 在非Apple平台上,_getRetainCount是唯一的选择,因为CFGetRetainCount在那里不可用。
请注意,_getRetainCount 提供了强引用、弱引用和无主引用计数的总和。如果您只想要强引用计数,可以使用 _getUnownedRetainCount_getWeakRetainCount 进行扣除。
至于实际应用场景,我唯一使用它的情况是编写测试以捕获保留循环。

-3
print(_getRetainCount(objectName))

3
好的,我会尽力按要求进行翻译。以下是需要翻译的内容:Please add explanation to your answer.请在您的回答中增加解释。 - mechnicov
类 Dettol{ } let d = Dettol() print(_getRetainCount(d)) - Subhajit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接