4

次のようなコード(たとえば、appController.m内)を使用して、アプリケーションの終了時にクリーンアップを実行します...

- (void) dealloc {
    [myObject release]; // myObject 's dealloc will not be called either !!!
    [arraySMSs release];
    [super dealloc];
}

このメソッドは、アプリが終了したときに呼び出されることはありません。なんで ?クリーンアップを行うためのより良い場所はありますか?呼び出されないという事実は、メモリリークの問題に対処しますか?または、OSがクリーンアップを処理しますか?

ありがとうございました...

4

4 に答える 4

10

アプリケーションの終了時にすべてのオブジェクトが個別に割り当て解除されることをシステムが保証する理由はありません。

そうすることは、CPU サイクルの無駄であり、ユーザーの時間の無駄です。

アプリが終了すると、そのアプリによって使用されるすべてのリソースは、システムによって完全に自動的かつ避けられない方法で回収されます。

アプリの終了時に何かを行う必要がある場合は、そのためにアプリケーション デリゲートのフックを使用します。しかし、それに頼らないでください。ユーザーは、デバイスを強制的に再起動したり、アプリケーションを強制終了したりすることができます。

于 2011-02-22T16:53:31.423 に答える
3

NSObject Reference からの引用は次のとおりです。「重要: アプリケーションが終了すると、プロセスのメモリは終了時に自動的にクリアされるため、オブジェクトに dealloc メッセージが送信されない可能性があることに注意してください。オペレーティング システムがリソースをクリーンアップできるようにする方が効率的です。すべてのメモリ管理メソッドを呼び出します。」多くの人が言っていることをほぼ確認しています。

于 2011-09-02T23:52:52.040 に答える
3

いい質問です、私も混乱しました。

今私はこれを得ました:

appDelegate クラス自体に負っているカスタム コードによって管理されるオブジェクトはないと述べたので、そのインスタンスを "解放" することを実際に心配する必要はありません。UIApplication はそれを保持する唯一のクラスですが、私たちはそれを負っていません。

ただし、学術的な議論のため、または現時点でわからない目的がある場合は、 appDelegate クラスで dealloc をテストしたい場合:

applicationWillTerminateアプリが終了するかどうかを確認するのに最適な場所です。

- (void)applicationWillTerminate:(UIApplication *)application
{
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
    [UIApplication sharedApplication].delegate = nil;
    // after this, the dealloc method of our appDelegate class will be called
}
于 2013-06-03T14:21:16.073 に答える
-1

dealloc が呼び出されていないと思う理由は何ですか? これはデバッガーを実行しましたか? dealloc メソッドで NSLog を必ずしも呼び出せない理由については、この質問を参照してください: dealloc はいつ実行されますか?

于 2011-02-22T14:50:26.177 に答える