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

Art*_*rov 7 iphone cocoa cocoa-touch objective-c

每个iPhone应用程序中都有很多对象会永远存在,直到应用程序死亡.它们是:应用程序委托,窗口,主视图控制器,可以是导航或制表符控制器,其中的所有对象.为什么在地球上我应该在退出花费宝贵的CPU周期之前释放它们?据我所知,应用程序进程将被终止,因此它的堆,一致或不一致也将消失.

那我为什么要发布呢?Apple的开发手册坚持使用它,如下面的代码示例(来自iPhone开发指南).这是我在图书馆中通过单词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
Run Code Online (Sandbox Code Playgroud)

NHObject-dealloc方法的讨论部分:

需要注意的是,当一个应用程序终止,对象可能不会被发送dealloc的消息,因为进程的内存被自动清除上退出,它是更有效简单地允许操作系统来清理资源,而不是调用所有的内存管理方法.出于这个原因和其他原因,您不应该在dealloc中管理稀缺资源

但是如果您的应用程序足够快以在15秒内对applicationWillTerminate作出反应,则在当前实现中调用上面示例中的dealloc方法.

再说一遍.我是否应该避免在应用程序退出速度上面编写dealloc方法,或者这种方法有任何问题吗?

Ken*_*ner 6

因为你会知道,Artem.

让我们玩一个名为"如果"的小游戏.

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

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

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

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

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

所以,他们搬进了你的.每一天,更到达,少留空间YOURSELF.

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


zap*_*aph 0

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

  • 在 dealloc 中保存状态是一个非常糟糕的主意,因为不能保证 dealloc 会执行。applicationWillTerminate 用于保存状态。 (5认同)