轻松提问,但我想确定我不是傻瓜。
在我的iPad应用程序中,我正在动态创建UIView,并使用UIButtons,UIImageViews填充它,有时是MPMoviePlayerController,有时是带有一些UIImage作为动画的UIImageView。
经过一段时间后,我正在从屏幕上删除视图并将其丢弃。
问题是:我应该将这些对象中的任何一个设置为nil吗?
我在分配之后发布了所有内容,而且我没有任何泄漏。但是我的应用程序最终在耗尽内存后崩溃。我构建的这些视图中的每一个似乎都潜伏在内存中。
任何帮助,非常感谢。
Duncs
答案 0 :(得分:4)
很难在没有代码的情况下发表评论或者知道你是否使用ARC(不要猜测,因为你说“发布”)。
将变量设置为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
有关,但可能是其他问题。这就是我建议你使用乐器的原因。