我正在尝试保存两个字符串。一个字符串需要在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];
}
答案 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以完全省略数组,因为它只会占用空间并使代码复杂化。