为什么我应该在应用程序退出之前释放(因此dealloc)对象?

时间:2009-10-07 18:57:14

标签: iphone objective-c cocoa cocoa-touch

每个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方法,或者这种方法有任何问题吗?

5 个答案:

答案 0 :(得分:6)

因为你会知道,Artem。

让我们玩一个名为“假设”的小游戏。

如果,您开发了一款出色的应用。一个熟练的应用程序,真的 - 公众喜欢它!你的销售膨胀,鸟儿在天空中唱着你的名字!

但是,您选择不在AppDelegate dealloc中执行任何操作。只需几秒钟,你决定不打扰。有什么危害?

噢,起初你很容易睡在一堆钱上。但是随着销售的增长和增长,你会感到有点刺激。然后梦想就开始了。

方形,起初模糊不清。几天过去了,随着你的睡眠越来越少,它们越来越清晰。最后,有一天,你看。

他们是街区,Artem。 内存块。他们在你的梦中做了什么?嗯,你看,在应用程序退出之前没有完全摆脱存在,他们必须去某个地方。应用程序消失了,手机已经移动了。

所以他们搬进了你的 HEAD 。而且每天都有更多人到达,为自己留下更少的空间。

我希望这能提供丰富的信息...... Artem。

答案 1 :(得分:4)

我想唯一对我有意义的答案是“一致性”。不,你可能并不总是需要实施dealloc,但如果你总是这样做,你就不会忘记在它重要的时候这样做。此外,编写两行可能无法调用的代码并不会超过30秒。

你也不太可能浪费你宝贵的CPU周期(顺便说一句,这些周期并不是那么珍贵,以至于你会注意到差异。那些iPhone动画的存在主要是为了购买你的应用时间来启动/关闭因为当应用程序终止时,它通常不会打扰dealloc个对象,因为正如你所说的那样,堆的内存分配天数就在它后面。

所以,是的,dealloc不太可能在UIApplicationDelegate上被召唤,但无论如何都要花费你任何费用吗?不是真的。

答案 2 :(得分:3)

最好的理由是重用。你有可能将一个物体从一个地方移动到另一个地方或重新利用它。如果你这样做,最好确保你的所有i都是点缀的并且是交叉的。

这也是一个好习惯。如果你记得在那里做,你会在任何地方都这样做。

答案 3 :(得分:0)

因为释放的类可能具有副作用,例如在其dealloc方法或其中一个超类中保存状态。操作系统不应该关心,它应该回收所有资源,无论如何。

答案 4 :(得分:0)

您发布的代码示例并不坚持在应用终止时发布任何内容。如果您正在考虑dealloc方法,则在应用程序终止时不会调用它。

在文档的几个地方,Apple指出不在quit上发送dealloc是一种有意的设计选择,因为正如你所说的那样,释放整个地址空间会更有效率。请参阅discussion on the dealloc docs