3

NSObjectのドキュメントによると:

重要: アプリケーションが終了すると、プロセスのメモリは終了時に自動的にクリアされるため、オブジェクトに dealloc メッセージが送信されない場合があることに注意してください --- すべてのメモリ管理を呼び出すよりも、単にオペレーティング システムがリソースをクリーンアップできるようにする方が効率的です。メソッド。

それは問題ありませんが、オブジェクトの状態をディスクに保存したり、何かをログに記録したりするなど、dealloc で何かを行う必要がある場合はどうなりますか? コードが確実に呼び出されるようにするにはどうすればよいですか?

4

2 に答える 2

8

永続性管理は に結び付けるべきではありませんdealloc。オブジェクトの状態を保存したい場合は、ダーティなオブジェクトを収集し、時々、またはアプリケーションが終了/バックグラウンドになったときに変更を保存する、ある種のセッション オブジェクトが必要です。

アプリケーション設定の使用例: アプリケーションの設定を使用したくないとしましょうNSUserDefaults。おそらく、追加のロジックが必要なためです。すべての設定を保持するSettingsクラスがあり、明らかに変更を保持したいと考えています。

すべての永続性ロジックをクラスに詰め込むこともできますがSettings、それは単一責任の原則に違反しています。(= これが苦痛を引き起こすのには十分な理由があります。) したがって Session、 で行われた変更を永続化するクラスを追加できますSettings

アプリケーションが起動したら、 のインスタンスを作成し、以下Sessionを要求しSettingsます。

Session *session = [[Session alloc] init];
Settings *settings = [session loadSettings];

保存された設定を含むファイルがディスク上にある場合、セッションはそれをロードします (Settingsクラスが実装しているため、これは簡単NSCodingです)。そうでない場合、セッションは新しいSettingsインスタンスを作成し、それを返します。さらに、セッションはおそらく返されたSettingsインスタンスの変更を監視し始めますNSNotificationCenterSettings(設定が変更されたときにオブジェクトが通知を送信するのはごく自然なことです。)

セッションから取得したインスタンス内で何かを変更するSettingsと、セッションはそれを認識し、変更をディスクに保存します。Settings実装するので、これは簡単なはずNSCodingです。オブジェクトをダーティとしてマークし、数秒ごとに変更を保存することもできます。これは、オブジェクトを頻繁に更新する場合に適したソリューションです。その場合、アプリケーションが終了するかバックグラウンドに移行するときに、セッションを強制的に保存することもできます。

このシナリオが完璧だと言っているわけではありませんが、dealloc で持続するオブジェクトよりも確実に優れています :-)

于 2010-10-29T11:48:42.427 に答える
5

applicationWillTerminate:( )でオブジェクトが解放されることを確認しますNSApplicationDelegate

于 2010-10-29T11:48:10.077 に答える