5

iPhoneアプリを開発し、標準のNSUserDefaultsメカニズムを介して設定を保存しようとすると、非常に一貫性のない結果が発生します。私はEricaSadunによるiPhoneDeveloper'sCookbook(素晴らしい本)からほぼ直接コードを使用しています。次のようになります。

(void)updateDefaults
{{
    NSMutableArray *pells = [[NSMutableArray alloc] init];
    NSMutableArray * locs = [[NSMutableArray alloc] init];

    for(DragView * dv in [boardView subviews])
    {{
        [spells addObject:[dv whichSpell]];
        [locs addObject:NSStringFromCGRect([dv frame])];
    }

    [[NSUserDefaults standardUserDefaults] setObject:spells forKey:@ "spells"];
    [[NSUserDefaults standardUserDefaults] setObject:locs forKey:@ "locs"];
    [[NSUserDefaultsstandardUserDefaults]同期];

    [呪文の解放];
    [locsリリース];
}

値は保存されることもあれば、復元されることもあります。何が機能するのか、何が機能しないのかについて正確なビーズを取得することはできません。

他の誰かが同じような経験をしていますか?何がそれを機能させるのかについての提案はありますか?同期方法は、ディスクへの書き込みを強制して値を保存するための最良の方法ですか、それともより良いものがありますか(本番環境とシミュレーターの両方)。

ありがとうライアン

4

2 に答える 2

2

Mac OS X では、おそらく iPhone OS でも、デフォルト データベースにはプロパティ リスト オブジェクト (NSString、NSNumber、NSArray、NSDictionary、および NSData) のみを含めることができます。

コード スニペットからは、呪文のタイプが明確ではありませんが、上記のいずれでもない場合、デフォルト データベースに保存されません。オプションは次のとおりです。

  1. オブジェクトを plist 表現との間で変換するメソッドを作成します。つまり、オブジェクトから NSDictionary を作成するメソッドと、NSDictionary を使用してオブジェクトを初期化する別のメソッドです。NSArray または NSString として保存することもできます。
  2. オブジェクトに NSCoding プロトコルを実装させ、NSKeyedArchiver を使用してオブジェクトを NSData オブジェクトに変換し、NSKeyedUnarchiver を使用して元に戻します。
于 2009-02-04T09:33:45.523 に答える
2

配列を保存するには、次のような NSKeyedArchiver を使用する必要があります。

[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:spells] forKey:@"spells"];
[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:locs] forKey:@"locs"];
[[NSUserDefaults standardUserDefaults] synchronize];

カスタム クラスの場合は、スペル クラスが NSCoding プロトコル (encodeWithCoder: および initWithCoder:) を実装していることも確認する必要があります。locs は NSStrings のように見えますが、これは問題なくアーカイブされます。

また、次のようなことをする必要があります

NSData *dataRepresentingSavedSpells = [currentDefaults objectForKey:@"spells"];
if (dataRepresentingSavedSpells != nil)
{
    NSArray *oldSpells = [NSKeyedUnarchiver unarchiveObjectWithData:dataRepresentingSavedSpells];
}

デフォルトから古い値をロードします。

私は同期を使用して終了時にディスクに書き込みますが、私の経験では非常に信頼できます。

于 2009-01-24T03:38:44.557 に答える