2011-05-13 156 views
2

初学者关于如何在使用包含一对图像(约500K)的UIView时如何提高内存效率的问题。我猜如果我以错误的方式处理这个视图并将这个视图称为十次或二十次,我的应用程序将崩溃(因为我泄漏了大约5-10 MB的RAM)。UIView和内存管理

我有我创建编程,像这样的的UIView:

myView = [[UIView alloc] initWithFrame:0,0,0,0]; 

这个观点我添加一些图片,以便它吃掉的内存500K。在完成这个观点之后,我想再次释放内存。所以我编码:

[myView removeFromSuperview]; 
myView = nil; 
[myView release]; 

这是要走的路吗?我对上一次发布的电话特别不确定。如果我从超级视图中删除它并将其设置为零,myView是否已经发布?

而且,那会是一个好主意,只是在一审自动释放MyView的,即

myView = [[[UIView alloc] initWithFrame:0,0,0,0] autorelease]; 

我会的任何建议和更正感激。

回答

4

您正在发送release消息至nil。对于这些语句的正确顺序应该是:

[myView removeFromSuperview]; 
[myView release]; 

和可选之后:

myView = nil; 

有关为什么要设置为nil讨论:

当您将其添加为子视图时,超级视图保留您的视图,然后在删除视图时将其释放。你仍然需要你释放你的持有。分配它时可以使用autorelease,但由于您需要保留指向它的指针才能发送removeFromSuperview,因此正确的方法是在完成该指针后发送release(然后将该指针设置为nil) 。

2

如果您在致电release之前将视图设置为nil,则会泄漏视图,然后向nil发送消息。首先,你必须释放的观点:

[myView removeFromSuperview]; 
[myView release]; 

然后您可以将变量设置为nil,以避免将消息发送到一个释放的实例。

1

关于自动释放,我认为这只是个人喜好的问题,但我觉得它更容易跟踪内存的问题时做:

myView = [[[UIView alloc] initWithFrame:0,0,0,0] autorelease]; 
// add myView to wherever it belongs 
..... 
[myView removeFromSuperview]; 
myView = nil; 

正如其他人所指出的那样,前settting到myViewnil您致电release是不正确的,会泄漏内存。