1

我在某处读到,如果由于内存不足警告(一旦用户想要查看它就再次加载它)而临时放弃视图时,我会遇到内存问题,如果 ViewController 类不做这样的事情在每个该观点的出处:

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

我在这里很困惑,因为实际上我认为 [myView release] 也会使 nil-thing,说变量不再包含对象。为什么两次?还是我错过了什么?

4

2 回答 2

5

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

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

于 2009-04-24T16:17:06.547 回答
0

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

- (void)setView:(UIView *)view
{
  [super setView:view];
  if (view == nil)
  {
    // Release-and-nil any subviews that you might be retaining.
  }
}
于 2009-04-24T18:30:05.103 回答