我使用 Objective C 和 Cocoa 框架进行开发已经有一段时间了。然而,我仍然不是很清楚,什么时候应该将对象引用设置为 nil。我知道建议在释放具有委托(delegate)的对象之前这样做,并且您还应该在保留 subview 的 viewDidUnload 方法中这样做。但究竟什么时候应该这样做,为什么?它究竟完成了什么?提前谢谢你。
-奥斯卡
最佳答案
假设您在类的接口(interface)中定义了一个指针 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!!!
关于iphone - Objective C iPhone 何时将对象引用设置为 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1670876/