1

我正在尝试保存两个字符串。一个字符串需要在 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];
}
4

3 回答 3

2

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

相反,把你的狗放在旅行车里(或者把你的绳子放在一个数组里)。您可以使用[NSArray arrayWithObjects:@"string1", @"string2", nil];. 将其粘贴在字典中以获取给定键,以及最终字符串作为另一个键,保存它,您将拥有一个包含一个或多个字符串的数组的 plist。

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

于 2009-06-09T23:15:33.487 回答
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

于 2009-06-10T00:57:21.050 回答
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 以完全省略数组,因为它只会占用空间并使代码复杂化。

于 2009-06-11T17:17:15.867 回答