如何将字符串作为数组存储在Cocoa属性列表中?

时间:2009-06-09 21:28:59

标签: iphone objective-c plist ipod-touch

我正在尝试保存两个字符串。一个字符串需要在pList中保存为ARRAY类型,第二个字符串需要在Array中保存为String。

我可以使用代码:

[字典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];
}

3 个答案:

答案 0 :(得分:2)

您无法将字符串转换或以其他方式转换为数组;它们是独立的,不同的对象。就像在现实生活中你试图把你的狗变成旅行车一样,它没有发生。

相反,将您的狗放在旅行车内(或将您的绳子放在一个阵列中)。您可以使用[NSArray arrayWithObjects:@"string1", @"string2", nil];创建数组。将其粘贴到字典中以获取给定的键,以及最后一个字符串替换另一个键,保存它,并且您将拥有一个包含一个或多个字符串数组的plist。

此外,在您的代码示例中,您的字典正在泄漏内存。阅读Objective-C中的内存管理,在你理解它之前,你会遇到很多崩溃和性能问题。

答案 1 :(得分:0)

您可以使用

将字符串转换为单个元素数组
[NSArray arrayWithObject:str];

因此,如果您希望plist将条目包含为字符串数组,并且您只需要一个字符串作为元素,那么您可以执行以下操作:

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

除非你想在其他时间允许每个密钥使用多个字符串,否则我实际上并不是你想要这样做的原因。

另外,正如Marc所说,你正在泄露你创建的初始(不可变)的行为。阅读http://developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html处的内存管理规则。

此外,您不应该在应用程序的包中写入内容。首先,您的应用程序可能位于写保护卷上,或者当前用户可能无权更改它。另一方面,该文件将由所有用户共享。而对于第三个,它将破坏代码签名。而是将文件写入Preferences文件夹或Application Support文件夹。

最后,如果这些是某种用户首选项,那么您应该使用首选项系统,该系统允许配置默认值并将首选项存储在首选项文件夹中。有关详细信息,请参阅http://developer.apple.com/documentation/Cocoa/Conceptual/UserDefaults/UserDefaults.html

答案 2 :(得分: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:],只需使用字符串文字。如果要在数组中使用不同的字符串,可以将其作为附加参数传入,从其他方法中获取等等。

这种方法仍然很脆弱,因为它只在与给定键匹配的数组中存储一个字符串 - 同样,如果方法名称更能说明它的作用,那么方法名称会更好。此外,如果每个键只有一个字符串值,您可以考虑修改plist以完全省略数组,因为它只会占用空间并使代码复杂化。