在Objective-C中删除动态创建的对象时,我应该将其设置为nil?

时间:2012-05-10 16:32:43

标签: objective-c ios memory uiview null

轻松提问,但我想确定我不是傻瓜。

在我的iPad应用程序中,我正在动态创建UIView,并使用UIButtons,UIImageViews填充它,有时是MPMoviePlayerController,有时是带有一些UIImage作为动画的UIImageView。

经过一段时间后,我正在从屏幕上删除视图并将其丢弃。

问题是:我应该将这些对象中的任何一个设置为nil吗?

我在分配之后发布了所有内容,而且我没有任何泄漏。但是我的应用程序最终在耗尽内存后崩溃。我构建的这些视图中的每一个似乎都潜伏在内存中。

任何帮助,非常感谢。

Duncs

2 个答案:

答案 0 :(得分:4)

很难在没有代码的情况下发表评论或者知道你是否使用ARC(不要猜测,因为你说“发布”)。

  1. 分析并解决它标记的每个问题。非常擅长告诉你是否正确保留/释放
  2. 使用泄漏工具查找泄漏
  3. 如果你没有更多的泄漏,但仍在崩溃,那么打开僵尸并确保你没有过早发布任何东西
  4. 将变量设置为nil不会释放内存。如果您使用@property声明了(retain),则自动生成的setter会将其设置为nil将释放旧值。

    具有属性的任何类的dealloc需要对指向保留对象的指针的所有属性执行此操作。对于UIViewControllers,您还希望在viewDidUnload中为IBOutlet属性执行此操作。

答案 1 :(得分:1)

当您使用ARC时,在将UIView添加为另一个UIView的子视图时,保留计数会增加。在你的“removeFromSuperview”它,它将减少,它将被解除分配。在非Arc环境中,在分配它并将其添加到UIView之后,retain将为2,但随后你将其释放,因此它将返回1.因此,它们之间始终存在平衡。要检查发生了什么,您应该使用工具,以查明问题。


当你拥有iVar的@property(用于保留)时,“nil”才有意义。这是为什么?因为它将释放旧值,并将新值设置为传递的值(在本例中为nil)。您可能认为问题与UIViews有关,但可能是其他问题。这就是我建议你使用乐器的原因。

相关问题