我看过周围的示例源代码使用不同的方式释放/解除对象,所以我想知道哪种方式被认为是“最好的”。 -dealloc
上的一些选项:
1)发布对象
- (void)dealloc {
[obj1 release];
[obj2 release];
[super dealloc];
}
2)将对象设置为nil
- (void)dealloc {
self.obj1 = nil;
self.obj2 = nil;
[super dealloc];
}
3)直接取消分配对象
- (void)dealloc {
[obj1 dealloc];
[obj2 dealloc];
[super dealloc];
}
哪种方式最好?每个人的利弊?
答案 0 :(得分:8)
方法1是唯一推荐的方法。在你释放它们之后将它们设置为nil也是一种好习惯。
方法2仅适用于管理自己的对象/值保留的属性,因此它不是普遍适用的。如果你实现自己的setter方法,当属性发生变化时执行其他操作,你可以通过在[dealloc]中调用它来获得不希望的副作用。
方法3违反了引用计数原则,因为它会释放对象,即使其他对象有[retain]保留,所以当其他对象接下来访问它们时,程序将崩溃。你永远不应该直接调用[dealloc] - 让运行时在最后一个所有者调用[release]时调用它。
答案 1 :(得分:1)
如果obj1和obj2是使用@ synthesize-d访问器的属性,则方法1和方法2是等效的。如果这两个条件中的任何一个不成立,那么效果就会大不相同。如果它们不是属性,那么方法2只是将指针设置为nil,而不执行任何会释放对象的内容。如果它们是属性但您已经实现了自己的setter方法,则方法2将“nil”作为参数调用这些方法。这是否等同于方法1取决于您如何实现这些方法。如果您的自定义setter在参数为nil时执行任何重要操作,则方法2将确保执行此代码。
正如Marco所说,方法3是完全错误的。如果您看过示例代码,那么作者可能实际上并不知道他们在做什么。