【发布时间】:2010-12-04 17:54:43
【问题描述】:
每个 iPhone 应用程序中都有很多对象将永远存在,直到应用程序消亡。它们是:应用程序委托、窗口、主视图控制器,可能是导航或选项卡控制器,它们中的所有对象。为什么我应该在停止花费宝贵的 CPU 周期之前释放它们?据我了解,应用程序进程将被终止,因此它的堆,一致与否也将消失。
那么我为什么要释放它们呢? Apple 的开发手册坚持它就像在代码示例中一样(来自iPhone Development Guide)。这只是我在图书馆中找到的第一个按词 dealloc 搜索的地方。
@implementation HelloWorldAppDelegate
@synthesize window;
- (void)applicationDidFinishLaunching:(UIApplication *)application {
// Override point for customization after app launch
MyView *view = [[MyView alloc] initWithFrame:[window frame]];
[window addSubview:view];
[view release];
[window makeKeyAndVisible];
}
- (void)dealloc {
[window release];
[super dealloc];
}
@end
来自NHObject-dealloc 方法的讨论部分:
请注意,当应用程序终止时,可能不会向对象发送 dealloc 消息,因为进程的内存在退出时会自动清除 - 简单地允许操作系统清理资源比调用所有内存管理方法。由于这个和其他原因,您不应该在 dealloc 中管理稀缺资源
但如果您的应用程序足够快以在 15 秒内对 applicationWillTerminate 做出反应,则在当前实现中调用上面示例中的 dealloc 方法。
再说一遍。我应该避免为应用退出速度编写上面的 dealloc 方法还是这种方法有任何问题?
【问题讨论】:
-
苹果的说明书在哪里坚持呢?我曾一次或多次阅读过他们的大部分文档,但不记得了——事实上,我记得在几个地方读过相反的内容,即不解除分配对效率更好。
-
Apple 还声明,不能保证在其中某些类退出时您会得到一个 dealloc 调用。因此,将代码保存在您的 dealloc 例程中将是一件坏事。
-
在这种情况下,何必为他们写dealloc代码呢?
-
@Chuck 我没有找到你提到的任何优化技巧。非常感谢您发布其中一个作为此问题的答案。
-
应用的原则是所有类都应该有一个-dealloc,以防你重用它们。 (例如,您可能想要编写单元测试。)确保在您退出时释放每个对象并不是一个好主意,Apple 也不鼓励这样做。这是浪费时间和精力。 (事实上,在 Mac OS X 10.6 中,有一个 API 可以让系统在不保存任何内容的情况下立即终止您的应用,以节省时间和电力。我希望这将在 iPhone 4.0 中实现。)
标签: iphone objective-c cocoa cocoa-touch