不做dealloc

时间:2010-04-12 14:45:38

标签: iphone objective-c uiview

我在超级视图中有这个:

mySubView = [[MySubView alloc] init];
[self addSubview:mySubView];
[mySubView release];

然后在某个时候,在子视图中,这个:

[self removeFromSuperview];

当我调试它时,我注意到子视图的dealloc永远不会被调用,即使我很确定引用计数应该为0.任何想法为什么会这样?感谢。

4 个答案:

答案 0 :(得分:3)

是的,当您发送removeFromSuperview时,随后会发送已发送的消息。并且每次释放呼叫减少保留计数。以防万一:

MySubView * mySubView = [[MySubView alloc] init];
[window addSubview:mySubView];
[mySubView release];
[mySubView removeFromSuperview];

结果将如您所愿:在removeFromSuperview之后,mySubView的保留计数变为0,并且将调用dealloc。

但是在你的例子中有更多的代码“然后在某个时间点后面”和其他一些对象(它不是superview)保留mySubView。例如,您可以记录retainCount值以查看视图保留/关联的位置。

答案 1 :(得分:1)

您不能依赖retainCount来提供任何有用的调试信息。在某些情况下,它可能会对您有所帮助,但Apple文档说:

  

重要说明:此方法在调试内存管理问题时通常没有价值。因为任何数量的框架对象可能保留了一个对象以保存对它的引用,而同时自动释放池可能在对象上保留任意数量的延迟版本,所以您不太可能从此获取有用信息方法。   要了解必须遵守的内存管理的基本规则,请阅读“内存管理规则”。要诊断内存管理问题,请使用合适的工具:   LLVM / Clang静态分析器通常可以在运行程序之前发现内存管理问题。   Instruments应用程序中的Object Alloc仪器(参见仪器用户指南)可以跟踪对象分配和销毁。   Shark(参见Shark用户指南)还描述了内存分配(在程序的许多其他方面)。

答案 2 :(得分:0)

我不知道 removeFromSuperview 是否这样做,但是需要释放superview中的指针。如果 removeFromSuperview 仅将子视图中的指针释放到超级视图而不是超级视图中指向子视图的指针,则可能是您的问题的根源。

答案 3 :(得分:0)

  

我很确定引用计数应为0。

你是吗?为什么呢?

忘记保留计数。只考虑对象所有权,因为保留计数几乎完全没有意义,因为它有助于调试内存管理。

Apple提供了许多用于调试内存管理问题的工具。使用它们。

此链接可能会有所帮助。

http://developer.apple.com/iphone/library/documentation/Performance/Conceptual/ManagingMemory/Articles/FindingPatterns.html