当涉及低内存警告时,我在多视图应用程序中需要考虑什么?

时间:2009-04-24 15:53:10

标签: iphone objective-c memory-management uikit

我正在阅读的某个地方,当我因为内存不足警告而暂时放弃一个视图时会遇到内存问题(如果用户想要看到它就会再次加载它),如果ViewController类没有这样做的话在这个观点的每个出口都有这个:

-(void)dealloc {
    [myView release], myView = nil;
    [myLabel release], myLabel = nil;
    [super dealloc];
}

我在这里感到困惑,因为实际上我认为[myView release]也会成为nil-thing,说变量不再存在任何对象。为什么两次?或者我错过了什么?

2 个答案:

答案 0 :(得分:5)

调用[myView release]不会更改myView的值,它会减少myView指向的对象的保留计数(以及对象的保留计数为零时) ,它dealloc本身)。调用[myView release]后,myView仍然包含视图对象的地址,但如果myView是唯一的所有者,则该对象已自行dealloc并且内存不再存在有效(我现在被另一个对象或其他数据占用)。通过将myView设置为nil,您可以确保不会意外地使用过去属于myView的旧内存,现在您可以测试myView是否有已被初始化或丢弃。

请注意,您无需在myView方法中将nil设置为-dealloc,因为无论如何您的视图控制器都会消失,但您可能希望这样做如果您丢弃视图以响应内存不足警告,请执行此操作。如果视图不可见,您也可以考虑丢弃整个视图控制器。

答案 1 :(得分:0)

当视图控制器收到内存警告,并且视图在屏幕外时,它可能会将view属性设置为nil。但是,这不会释放您可能在其他属性中保留的任何子视图。所以这就是你如何处理:

- (void)setView:(UIView *)view
{
  [super setView:view];
  if (view == nil)
  {
    // Release-and-nil any subviews that you might be retaining.
  }
}