どのように私はココアのプロパティリストの配列として文字列を格納していますか?

StackOverflow https://stackoverflow.com/questions/972605

質問

私は2つの文字列を保存しようとしています。型PLISTの配列と第2のストリングは、アレイ内の文字列として保存される必要があるように1つの文字列を保存する必要がある。

私は、コードを使用することができます:

[辞書のsetObject(ID)anObject forKey:(ID)あるaKey>

が、それは正しく保存されません。私は配列として文字列のいずれかをキャストすることができますが、それはまだ正しく動作しません。

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];
}
役に立ちましたか?

解決

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

代わりに、ステーションワゴンの内側にあなたの犬を入れて(または配列内のあなたの文字列(複数可)を入れました)。あなたは[NSArray arrayWithObjects:@"string1", @"string2", nil];を持つ配列を作成することができます。別のキーのための最終的な文字列と一緒に、指定されたキーのためにあなたの辞書内でそのスティック、それを保存し、1つまたは複数の文字列の配列とのplistを持っています。

また、あなたのコードの例では、あなたの辞書には、メモリをリークしています。あなたはそれをよく理解するまでクラッシュやパフォーマンスの問題の多くに実行するつもりだ、Objective-Cでのメモリ管理をよく読んでます。

他のヒント

は、

を持つ単一要素の配列に文字列を変換します
[NSArray arrayWithObject:str];

あなたのplistは、文字列の配列としてエントリを含むようにしたい、とあなたが要素としてだけで単一の文字列をしたい場合は、その後、あなたのような何かをするのでます:

[dictionary setObject:[NSArray arrayWithObject:tempString] forKey:s1];
あなたが他のいくつかの時点でのキーごとに複数の文字列を許可する場合を除き、あなたはそれをこのようにしたいと思う理由を

私は実際にはありません。

マークが述べたように、

また、あなたが最初の(unmutable)をリークしているユーザーが作成するdectionary。 http://developer.appleでのメモリ管理のルールをお読みください。 COM /ドキュメント/ココア/概念/ MemoryMgmt /記事/ mmRules.htmlするます。

さらに、あなたはあなたのアプリケーションのバンドル内で書くべきではありません。一つには、アプリケーションがそれを変更する権限を持っていない可能性があり、書き込み保護されたボリュームまたは現在のユーザー上にあってもよいです。別の場合、ファイルは、すべてのユーザーによって共有されるだろう。そして第三のために、それはコード署名を破ります。代わりに、Preferencesフォルダやアプリケーションサポートフォルダのいずれかにファイルを書き込みます。

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

次のように

plistファイルへのにNSArray の(単独で)を保存するための正しい方法である

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];
}

これはまた、あなたが使用する必要はありません(これはGCの下の問題ではありませんが、それはまだ悪い習慣です。)-mutableCopyの受信機が1の保持カウントを脱出する場合は、あなたのコードのメモリリークを回避します+[NSString stringWithFormat:]は、単なる文字列リテラルを使用しています。あなたは、アレイ内の文字列として別のを使用したい場合、あなたは、追加のパラメータとして渡すなど、他の方法、からそれをつかむことができます。

このメソッドはまだそれだけが店舗で脆い与えられたキーと一致する配列の1つの文字列 - それはそれがない正確に何をもっと示していた場合も、メソッド名が良いだろう。各キーに1つの文字列値が存在することになる場合にも、あなたはそれだけでスペースを咀嚼し、コードを複雑にするので、完全配列を省略したplistの見直しを検討してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top