如何存储字符串作为一个可可属性列表的数组?
-
13-09-2019 - |
题
我试图挽救两个字符串。一个串需要在plist中保存为型阵列和所述第二串需要在阵列保存为字符串。
我可以使用的代码:
[字典的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];
数组。坚持你的字典里对于给定的关键,用你的另一个关键最后串一起,保存它,你就会有一个或多个字符串数组的plist中。
此外,在代码示例你的字典正在泄漏内存。阅读上的Objective-C的内存管理,你走,直到你充分理解它碰到大量的崩溃和性能问题。
其他提示
您的字符串转换为一个单一的元件阵列
[NSArray arrayWithObject:str];
所以,如果你希望你的plist包含条目的字符串数组,你想只是一个单一的字符串作为一个元素,那么你就这样做:
[dictionary setObject:[NSArray arrayWithObject:tempString] forKey:s1];
其实我并不没有你为什么会想是这样,除非你要允许每个键多个字符串在其他时间。
此外,如马克提到的,你正在泄漏的初始(unmutable)dectionary创建。阅读在 http://developer.apple的内存管理规则。 COM /文档/可可/概念/ MemoryMgmt /文章/ mmRules.html 。
此外,你永远不应该应用程序的包里面写。一方面,你的应用程序可以是写保护的卷或当前用户上可能没有权限去改变它。另一个原因是,该文件将被所有用户共享的。而对于第三个,它会破坏代码签名。相反,文件写入任一首选项文件夹或应用程序支持文件夹。
最后,如果这些意图是某种形式的用户偏好,那么你应该使用偏好系统,该系统允许配置默认值,并存储在首选项文件夹中的喜好为您服务。请参见 http://developer.apple.com/documentation/Cocoa/Conceptual /UserDefaults/UserDefaults.html 了解更多的信息。
保存正确的方法的的的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完全忽略阵列,因为它只是嚼了空间和代码的复杂性。