我有一些嵌套在UIViews中的UIImageViews,它们将它们组合在一起。它们由视图控制器拥有。一旦调用了-viewWillDisappear方法,我就想用它们的UIViews一起删除那些UIImageViews,以便释放内存。
我在包含UIImageViews作为子视图的UIViews上调用-release。没有别的东西拥有UIImageViews。我所拥有的只是UIView的一个实例变量,它将UIImageViews组合在一起。
所以当我发送 - 释放它时,保留计数应该变为0.但这并不能保证我获得更多可用内存,对吧?所以,我也设置了myUIView = nil。这有用/有用吗?你如何安全地释放内存?
答案 0 :(得分:3)
在-viewDidDisappear
(不是-viewWillDisappear
;此时仍然在屏幕上)最好的办法是针对这种情况调用self.view = nil
。这将转储整个视图控制器的视图,该视图将在下次需要时自动重新加载。
如果您在这些视图上有任何IBOutlets,则需要将它们设置为nil,否则它们将不会释放。假设您有这样的设置:
@interface MyViewController : UIViewController
{
UIImageView *_imageView;
}
@property (readwrite, retain) IBOutlet UIImageView *imageView;
@implementation MyViewController
@synthesize imageView = _imageView;
然后你需要在你的`-viewWillDisappear中调用self.imageView = nil
。
除了访问者和-release
之外,您通常不应在您的ivars上致电-dealloc
。释放它们的正确方法是使用访问器将它们设置为nil。
当retainCount为1时,-release
将立即调用free()
,这将恢复内存。但请记住,其他事情可能会保留对象,包括自动释放池,因此您可能无法确定在任何给定时间保留计数是什么。
我强烈建议人们在发布变量时立即将其设置为nil。这不会影响变量;它只是保护你不要追逐你已经发布的指针,因此现在可能指向未分配的内存。所以在-dealloc
中,我的行看起来像这样:
[_stuff release]; _stuff = nil;
[_otherStuff release]; _otherStuff = nil;