如何通过从屏幕上删除UIImageViews来安全地释放内存?

时间:2009-05-24 13:55:23

标签: iphone cocoa-touch memory-management uikit

我有一些嵌套在UIViews中的UIImageViews,它们将它们组合在一起。它们由视图控制器拥有。一旦调用了-viewWillDisappear方法,我就想用它们的UIViews一起删除那些UIImageViews,以便释放内存。

我在包含UIImageViews作为子视图的UIViews上调用-release。没有别的东西拥有UIImageViews。我所拥有的只是UIView的一个实例变量,它将UIImageViews组合在一起。

所以当我发送 - 释放它时,保留计数应该变为0.但这并不能保证我获得更多可用内存,对吧?所以,我也设置了myUIView = nil。这有用/有用吗?你如何安全地释放内存?

1 个答案:

答案 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;