假设你在你的类的接口中定义了一个指针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 调用完成的,而不是通过分配零。如果您有一个保留计数为 1 的对象,并将 nil 分配给它的唯一变量,您将泄漏内存:
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0,0,10,10)];
view = nil;
// You just leaked a UIView instance!!!