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