2010-12-30 7 views
7

NSUserDefaultsが私のアプリケーションのライブラリ/環境設定に迷惑plistファイルを残している理由を理解できません。などなぜNSUserDefaultsは私のアプリのライブラリ/環境設定に一時plistファイルを残していますか?

私は、次のファイルを見ている...

com.mycompany.myapp.plist 
com.mycompany.myapp.plist.3gaPYul 
com.mycompany.myapp.plist.c97yxEH 

は... plist.*ファイルは0バイトです。アプリが実行されるたびに、新しいアプリが残っているようだ。私は -[NSUserDefaults synchronize]を呼んでいないことを確認しましたが、私がそれを呼び出すと、所定の実行のために迷惑なファイルの外観が早くなります。デバッガをステップ実行すると、呼び出しを呼び出して同期をとるとすぐに新しいファイルが表示されます。同期呼び出しを取り出すと、新しい迷惑メールファイルがアプリ起動時に表示されることがあります。

スレッドにユーザーのデフォルトを設定している可能性はありますか(おそらく、おそらく可能性があります)、スレッドセーフであるとドキュメントが考えていると考えています。

何か助けていただければ幸いです。ありがとう!

編集:私は回答者の考え方に同意するが、それは「なぜ?」を説明していませんCFPreferences creates multiple files

はただ、これを見つけました部。

+0

これはかなり狂っています。理由を知ることができたら教えてください! –

+0

私はまったく同じ問題を抱えていました。一時的なplistsが実際にiPadを完全に埋め尽くしてしまいました(数千〜4Mbのファイルが複数のGbを表すようになりました)。間違いなくiOSのバグのように見えます。 – quentinadam

答えて

3

私はこれがアップルのバグだと確信していますが、私はそれを示す小さなサンプルを作ることができませんでした。 Appleのアプリケーションがこれをしているとの沢山のフィードバックがありました。私は一種の壁にぶつかって動き続けなければならないので、以下に示すような厄介なハッキングを終わらせました。

@implementation NSUserDefaults(Hack) 

- (BOOL)synchronize 
{ 
BOOL result = CFPreferencesAppSynchronize((CFStringRef)[[NSBundle mainBundle] bundleIdentifier]); 
if (!result) 
{ 
    // there's probably a temp file lingering around... try again. 
    result = CFPreferencesAppSynchronize((CFStringRef)[[NSBundle mainBundle] bundleIdentifier]); 

    // regardless of the result, lets clean up any temp files hanging around.. 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    NSString *prefsDir = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/Preferences"]; 
    NSDirectoryEnumerator *dirEnumerator = [fileManager enumeratorAtPath:prefsDir]; 
    NSString *file = nil; 
    NSString *match = [[[NSBundle mainBundle] bundleIdentifier] stringByAppendingString:@".plist."]; 
    while ((file = [dirEnumerator nextObject])) 
    { 
     if ([file rangeOfString:match].location != NSNotFound) 
     { 
      NSString *fileToRemove = [prefsDir stringByAppendingPathComponent:file]; 
      [fileManager removeItemAtPath:fileToRemove error:nil]; 
     } 
    } 
} 

return result; 
} 
+1

私はまったく同じ問題を抱えていました。一時的なplistsが実際にiPadを完全に埋め尽くしてしまいました(数千〜4Mbのファイルが複数のGbを表すようになりました)。間違いなくiOSのバグ。 – quentinadam

1

これらのplistファイルはアプリケーションの起動の間に保持されますか?環境設定を保存するときにエラーが発生していますか?あなたの公式 plistに書き込み権限が有効になっていますか?

プロパティリストは、アトミックに書き込むことができます。つまり、最初に一時ファイルに書き込まれ、書き込み操作中にエラーがなければ、一時ファイルの名前が元のファイル名に変更されます。通常の状況では、一時ファイルは表示されません。

+0

plistファイルは、起動の間に存続します。私はデータを格納するエラーを見ていないし、書き込み権限が正しいです。私は、一時的なファイルが他のアプリケーションに来て行くのを見ました。私は何年も前からこれをやってきました。この行動を初めて見たのは私の頭を本当に傷つけてしまったからです。提案のおかげで、許可をチェックすると考えていなかった。 – bsneed

1

あなたが保存しているデータは、適切な名前のファイルに書き込まれていますか?私はあなたがそれが暗示していると思います。私は、NSDefaults以外の何かによって書き込み権限を持っていて、適切に名前のついたファイルが開いていて、それが一時ファイルフェーズから安全な保存コピーをブロックしているのであれば疑問に思っていますか?

+0

もちろん、通常のデバッグ方法が適用されます。プロジェクトフォルダ全体をコピーし、一度に少しずつ物を引き裂いて単純化を開始し、その動作がいつ止まるかを確認してください。それを簡単に入手すると、あなたのバグを見つけるか、アップルのバグ報告者のための素敵なデモンストレーションプログラムがあります: -/ – Dad

+0

データが正しいファイルに作成されています。私は、Gity内でそのファイルを明示的に開くコードはないと思っていますが、それを探し続けるつもりです。 – bsneed

+0

アプリが通常の実行ループを実行していない可能性はありますか? (モーダル実行ループなどのように)。または、うーん、本当に頻繁に複数のスレッドからデフォルトを更新していて、最初のものが起こっている(または何か)のために、2番目のものが起こらない競合状態が見られているのだろうか... ...もっと見るしかし、この時点でOSのバグのようなものです... – Dad

関連する問題