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

问题描述 投票:3回答:2

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

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

iphone objective-c cocoa-touch
2个回答
8
投票

方法1是唯一推荐的方法。 在你释放它们之后将它们设置为nil也是一种好习惯。

方法2仅适用于管理自己的对象/值保留的属性,因此它不是普遍适用的。 如果您实现自己的setter方法,该方法在属性更改时执行其他操作,则可以通过在[dealloc]中调用它来获得不需要的副作用。

方法3违反了引用计数原则,因为它会释放对象,即使其他对象有[retain]保留,所以当其他对象接下来访问它们时,程序将崩溃。 你永远不应该直接调用[dealloc] - 让运行时在最后一个所有者调用[release]时调用它。


1
投票

如果obj1和obj2是使用@ synthesize-d访问器的属性,则方法1和方法2是等效的。 如果这两个条件中的任何一个不成立,那么效果就会大不相同。 如果它们不是属性,那么方法2只是将指针设置为nil,而不执行任何会释放对象的内容。 如果它们是属性但您已经实现了自己的setter方法,则方法2将“nil”作为参数调用这些方法。 这是否等同于方法1取决于您如何实现这些方法。 如果您的自定义setter在参数为nil时执行任何重要操作,则方法2将确保执行此代码。

正如马可所说,方法3是完全错误的。 如果您看过示例代码,那么作者可能实际上并不知道他们在做什么。

© www.soinside.com 2019 - 2024. All rights reserved.