1

2 つの文字列を保存しようとしています。1 つの文字列は pList に ARRAY 型として保存する必要があり、2 番目の文字列は配列に String として保存する必要があります。

コードを使用できます:

[辞書 setObject:(id)anObject forKey:(id)aKey>]

しかし、正しく保存されません。文字列の 1 つを配列としてキャストできますが、それでも正しく動作しません。

配列を pList に保存する適切な方法は何ですか?

これが私の pList の外観です。

<dict>
<key>Test One</key>
<array>
    <string>A13#</string>
</array>
<key>Another Test</key>
<array>
    <string>1111111111</string>
</array>
<key>Test Three</key>
<array>
    <string>2222222222</string>
</array>
<key>Final Test</key>
<array>
    <string>3333333333</string>
</array>
</dict>

ここに私がしようとしている方法があります

-(void)writeToFile:(NSString *)s1{
    NSBundle *bundle = [NSBundle mainBundle];
NSString *plistPath = [bundle pathForResource:@"saved" ofType:@"plist"];

NSMutableDictionary *dictionary = [[[NSDictionary alloc] initWithContentsOfFile:plistPath] mutableCopy];
NSString *tempString = [NSString stringWithFormat:@"1234567"];
[dictionary setObject:tempString forKey:s1];

[dictionary writeToFile:plistPath atomically:YES];
}
4

3 に答える 3

2

文字列を配列にキャストまたは変換することはできません。それらは別個の別個のオブジェクトです。実生活で犬をステーション ワゴンに変えようとしているのと同じですが、それは起こっていません。

代わりに、犬をステーション ワゴンの中に入れます (または、文字列を配列の中に入れます)。で配列を作成できます[NSArray arrayWithObjects:@"string1", @"string2", nil];。特定のキーの辞書内にそれを貼り付け、別のキーの最終文字列とともに保存すると、1 つ以上の文字列の配列を含む plist が作成されます。

また、コード例では、辞書がメモリをリークしています。Objective-C のメモリ管理についてよく読んでください。十分に理解するまで、多くのクラッシュやパフォーマンスの問題に遭遇することになります。

于 2009-06-09T23:15:33.487 に答える
0

NSArrayを (単独で) plist ファイルに保存する正しい方法は次のとおりです。

NSArray* anArray = ...;
[anArray writeToFile:@"/path/to/file.plist" atomically:YES];

ただし、NSString を配列​​として保存することはできません。あなたが提供した XML plist を考えると、同じ形式でエントリを追加したい場合は、このはるかに単純なコードを使用できます。

- (void) writeToFile:(NSString *)string {
  NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"saved" ofType:@"plist"];
  NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithContentsOfFile:plistPath];
  [dictionary setObject:[NSArray arrayWithObject:@"1234567"] forKey:string];
  [dictionary writeToFile:plistPath atomically:YES];
}

これにより、 の受信側が-mutableCopy保持カウント 1 でエスケープするコードのメモリ リークも回避されます (これは GC では問題ではありませんが、それでも悪い習慣です) +[NSString stringWithFormat:]。文字列リテラル。配列内の文字列として別のものを使用する場合は、追加のパラメーターとして渡すか、別のメソッドから取得するなどの方法があります。

このメソッドは、指定されたキーに一致する配列に 1 つの文字列しか格納しないという点で、まだ脆弱です。また、メソッド名は、それが何をするかをより正確に示している方がよいでしょう。また、各キーに文字列値が 1 つしかない場合は、配列を完全に省略するように plist を修正することを検討してください。これはスペースを食いつぶし、コードを複雑にするだけだからです。

于 2009-06-11T17:17:15.867 に答える
0

文字列を単一の要素配列に変換するには、

[NSArray arrayWithObject:str];

したがって、plist にエントリを文字列の配列として含め、要素として 1 つの文字列だけを含める場合は、次のようにします。

[dictionary setObject:[NSArray arrayWithObject:tempString] forKey:s1];

別の機会にキーごとに複数の文字列を許可したくない場合を除き、なぜこのようにしたいのか、実際にはわかりません。

また、Marc が述べたように、作成した最初の (変更不可能な) ディクショナリをリークしています。http://developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.htmlでメモリ管理ルールをお読みください。

さらに、アプリケーションのバンドル内には絶対に記述しないでください。たとえば、アプリケーションが書き込み保護されたボリューム上にあるか、現在のユーザーがボリュームを変更する権限を持っていない可能性があります。別の場合、ファイルはすべてのユーザーによって共有されます。そして 3 分の 1 は、コードの署名が破られることです。代わりに、Preferences フォルダーまたは Application Support フォルダーにファイルを書き込みます。

そして最後に、これらが何らかのユーザー設定であることを意図している場合は、設定システムを使用する必要があります。これにより、デフォルトの設定が可能になり、設定フォルダーに設定が保存されます。詳細については、 http://developer.apple.com/documentation/Cocoa/Conceptual/UserDefaults/UserDefaults.htmlを参照してください。

于 2009-06-10T00:57:21.050 に答える