Objective C iPhone何时将对象引用设置为nil

时间:2009-11-03 23:41:02

标签: iphone objective-c object release null

我已经用目标C和Cocoa框架开发了很长一段时间了。然而,我仍然不是绝对清楚的,我什么时候应该将对象引用设置为nil。我知道建议在释放具有委托的对象之前这样做,并且您还应该在viewDidUnload方法中对保留的子视图执行此操作。但究竟什么时候应该这样做,为什么?它究竟完成了什么?提前谢谢。

-Oscar

1 个答案:

答案 0 :(得分:40)

假设您在班级界面中定义了一个指针myView

@interface MyClass {
   UIView *myView;
}

@end

然后在您的代码中,您可以在某个时候释放该变量:

[myView release];

执行此操作后,指针myView将不会指向nil,而是指向可能不再存在的对象的内存地址(因为您刚刚释放它)。所以,如果你在此之后碰巧做了一些事情,比如:

[myView addSubview:otherView];

你会收到错误。

另一方面,如果你这样做:

[myView release];
myView = nil;
...
[myView addSubview:otherView];

addSubview的调用不会产生任何负面影响,因为忽略消息为nil

作为推论,您可能会看到使用retain属性的建议,例如:

@property(retain) UIView *myView;

然后在代码中,只需执行:

self.myView = nil;

通过这样做,合成的访问器将释放旧对象并在一行代码中将引用设置为nil。如果您想确保释放所有属性并将其设置为nil,这可能会很有用。

您必须永远忘记的一件事是,内存管理是通过retain release调用完成的,而不是通过分配nil来完成的。如果你有一个保留计数为1的对象,并将nil分配给它唯一的变量,那么你将会泄漏内存:

UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0,0,10,10)];
view = nil;
// You just leaked a UIView instance!!!