0

简单的问题警报,但我想确定我不是愚蠢的。

在我的 iPad 应用程序中,我动态创建了一个 UIView,并用 UIButtons、UIImageViews、有时是 MPMoviePlayerController、有时是 UIImageView 和一些 UIImages 作为动画填充它。

一段时间后,我将视图从屏幕上移除并丢弃。

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

我在分配后释放所有内容,并且没有任何泄漏。但是我的应用程序在内存不足后最终崩溃了。我建立的这些观点中的每一个似乎都潜伏在记忆中的某个地方。

任何帮助,非常感谢。

邓克斯

4

2 回答 2

4

没有代码或不知道您是否使用 ARC 很难评论(猜测不是,因为您说“释放”)。

  1. 进行分析并修复它标记的每个问题。它非常善于告诉你你是否正确地保留/释放
  2. 使用泄漏仪器查找泄漏
  3. 如果您没有更多泄漏,但仍然崩溃,请打开 Zombies 并确保您不会过早发布任何内容

将变量设置为 nil 不会释放内存。如果你有一个@property用 声明的(retain),自动生成的设置器将使它,因此将属性设置为 nil 将释放旧值。

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

于 2012-05-10T16:37:17.567 回答
1

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


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

于 2012-05-10T16:36:02.733 回答