我有一个UIViewController,它在我实例化时的retainCount为3。这让我感到非常不正确。如何最好地找出是谁把retainCount增加到3?我想实例化对象应该给指针1,然后我想可能将其推入UINavigationController的堆栈可能会增加1(不确定?),但第三个。。。是个谜。
我有一个UIViewController,它在我实例化时的retainCount为3。这让我感到非常不正确。如何最好地找出是谁把retainCount增加到3?我想实例化对象应该给指针1,然后我想可能将其推入UINavigationController的堆栈可能会增加1(不确定?),但第三个。。。是个谜。
Adam正确,您不应过于担心保留计数。
但是,如果您确实有解决此类问题的合法需求,一种好的技术是子类化受影响的类,以便可以添加覆盖内存管理方法。
例如,在UIViewController的子类中,您可以实现:
- (id) retain
{
// Break here to see who is retaining me.
return [super retain];
}
永远不要直接依赖保留计数。在初始化过程中,某些代码已经 retain
和 autorelease
了该对象。由于无法确定对象已被 autorelease
多少次,因此您实际上不知道真正的保留计数是多少。
保留计数应仅用作调试辅助工具,永远不应用作程序控制流。
只要您遵循Cocoa内存管理编程指南中规定的所有规则,就不会出现问题。
这不是一个百分之百的解决方案,但LLVM Clang静态分析器可以帮助追踪手动内存管理使用不正确的问题。在静态分析器和MallocDebug之间,您可以快速成为追踪内存管理问题的专家。顺便说一句,尽管Instruments是新的热门工具,但我发现MallocDebug更加可靠。
您可以在这里找到LLVM Clang静态分析器:LLVM/Clang Static Analyzer