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

标签 iphone objective-c object release null

我使用 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/

相关文章:

java - 在 Java 中使用 getJSONArray() 和 getJSONObject() 从 JSON 文件获取元素

iphone - ASIHTTPRequest 与 AFNetworking 框架

iphone - 创建 360 度图像转盘 View Controller ?

iphone - 键盘附件 View 隐藏文本

ios - iCarousel 拉动刷新并加载更多

objective-c - 设置 NSDateComponents 会导致不正确的 NSDate

iphone - 我的自定义类及其实例存在问题

objective-c - Objective-C/Cocoa 中的绑定(bind)与 IBOutlets

javascript - 在 Javascript 中创建对象数组的最佳方法是什么?

javascript - 在 Javascript 中,它们是一种检查对象方法和属性(例如 Python 的 dir())的方法吗?