7

オブジェクトのinitメソッドでNSUserDefaultsからロードします。オブジェクトのdeallocメソッドでNSUserDefaultsに保存できますか?

まったく同じようなもの:

-(void)dealloc {
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    [userDefaults setObject:self.filenamesArray forKey:self.defaultsKey];
    [userDefaults synchronize];
    self.filenamesArray = nil;
    self.defaultsKey = nil;
    [super dealloc];
}

良い、悪い、いいですか?それが良くないなら、どこが良いでしょう。

編集:

詳細な回答ありがとうございます。それらすべてが理にかなっています。これがユーザーのデフォルトに保存するのに不適切な場所である理由を私が発見したもう1つの理由は、deallocは、オブジェクトの割り当てが適切に解除された場合にのみ呼び出されるためです。私のアプリが強制終了された場合、このコードは実行されません。同様に、アプリがバックグラウンド(iOS 4)にプッシュされた場合、これは実行されません。明示的な[userDefaults synchronize]呼び出しも削除しました。少し緊張しますが、これはアップルに信頼を置いています。:)

4

2 に答える 2

7

-deallocが呼び出されるまでに、他のオブジェクトがそれに関心を放棄しているため、これは悪いことです。これには、さまざまな影響があります。

ユーザーのデフォルトを設定するのに適した場所は、設定が変更された瞬間です。そうすれば、すぐに永続化され、オブジェクトグラフの一部がすでに削除されている可能性があるため、設定が永続化されないことを心配せずにアプリを強制終了できます。

于 2010-11-13T22:58:30.787 に答える
0

-deallocでのユーザーのデフォルトの同期は、他の場所と同じです。これは、一見クレイジーに見えるかもしれませんが、-deallocは決して魔法ではなく、たとえばC ++デストラクタとは異なり、-deallocは実際にはまさに典型的な方法だからです。self.filenamesArrayをuserDefualtsに渡すことについては、少し心配する必要があります。これは、実際には実際の割り当て解除を超えて保持される可能性があるためですが、ユーザーのデフォルトでは保持されると思います。

いつすべきかについては[userDefaults synchronize];、人によって異なります。私は@Joshuaに個人的に同意しません。明示的に同期することはありませんが、NSUserDefaultsに処理させます。私が非常に間違えない限り、アプリが閉じたときに自動的に起動します。それ以外の場合は定期的に起動します。いつ更新されたかを知っていて、plistファイル全体を一度に書き込む必要があるので、デフォルトを書き込むときはAppleのアルゴに処理させるほうがいいと思います。これは、取るに足らない時間がかかるためです。ファイルシステムに書き込みます)。

(別のアプリケーションがデフォルトを読み書きするなど、ユーザーのデフォルトを取り巻く特別な状況がある場合は、最後の段落のいずれも適用されないことに注意してください)

于 2010-11-13T23:26:01.280 に答える