清理iPhone应用程序内存的最佳做法?

时间:2008-12-12 19:38:10

标签: iphone objective-c cocoa-touch

我看过周围的示例源代码使用不同的方式释放/解除对象,所以我想知道哪种方式被认为是“最好的”。 -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];
}

哪种方式最好?每个人的利弊?

2 个答案:

答案 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是完全错误的。如果您看过示例代码,那么作者可能实际上并不知道他们在做什么。