假设你有一个指针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。如果您想确保所有属性都被释放并设置为零,这可能会很有用。
你永远不能忘记的一件事是,内存管理是通过retain
release
调用,而不是通过赋值 nil 的方式。如果你有一个保留计数为 1 的对象,并将 nil 分配给它的唯一变量,你将泄漏内存:
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0,0,10,10)];
view = nil;
// You just leaked a UIView instance!!!