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