0

今、deallocメソッドでオブジェクトの状態( @public floatsをsに変換)を保存すると、NSString

+(void)savePreferences:(NSString*)key :(NSString*)value{
    NSMutableString* mutableString=[[NSMutableString alloc]initWithString:value];
    CFPreferencesSetAppValue((CFStringRef)key, mutableString, kCFPreferencesCurrentApplication);    // Set up the preference.
    CFPreferencesAppSynchronize(kCFPreferencesCurrentApplication);// Write out the preference data.
    [mutableString release];
}

間違った値が保存されます!?代わりに、リリースする直前に値を保存すると、正しい値が保存されます。最後[super dealloc];に注意深く電話することに注意してください。どうしてこれなの?

4

1 に答える 1

2

そのコードにはいくつかの問題があります。

  • -dealloc で状態を保存するのは遅すぎます。-dealloc が呼び出されるまでに、オブジェクト グラフは取り壊されている最中です。

  • アプリの終了時に、システムはアプリケーションを破棄するサイクルを無駄にしません。終了しようとしていることを通知してから終了します。-dealloc の呼び出しに依存している場合、それはおそらく起こらないでしょう。

  • そのメソッド名はあまり良くありません。のようなものを試してくださいsavePreferencesValue:forKey:。ただし、何度も呼び出される可能性があるという意味は、かなりの非効率性につながる可能性があります (設定 plist を何度も書き込むことになります)。

  • 着信値の変更可能な文字列コピーは、サイクルとメモリの無駄です。それは必要ありません

  • CFPreferences*() の拡張機能が必要でない限り、NSUserDefaults をそのまま使用する必要があります。コードが少なくなり、脆弱性が少なくなります。

于 2011-04-14T06:19:39.870 に答える