我使用以下代码写入plist(假设已经填充了dict):
[dict writeToFile:[appDelegate dataFilePath] atomically:YES];
我的App代表中的位置:
- (NSString *)dataFilePath {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
return [documentsDirectory stringByAppendingPathComponent:kFilename];
}
我用这个从磁盘读取plist:
NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithContentsOfFile:[appDelegate dataFilePath]];
这在编译我的应用程序4.2时有效,但由于我将其降至4.1以进行分发,它停止了工作。
[dict writeToFile:[appDelegate dataFilePath] atomically:YES];
返回NO。这有什么不对?
答案 0 :(得分:3)
我猜想其他一些变化会导致字典中出现非plist类型的对象。看看如果你分离出“生成plist”和“写plist”步骤会发生什么:
/* Generate plist. */
NSError *error = nil;
NSData *data = [NSPropertyListSerialization
dataFromPropertyList:dict
format:NSPropertyListBinaryFormat_v1_0
options:0/*unused*/
error:&error];
if (!data) {
NSLog(@"%s: Failed to serialize data: %@", __func__, error);
return;
}
/* Write data. */
NSString *path = [appDelegate dataFilePath];
BOOL ok = [data writeToFile:dataFilePath options:NSDataWritingAtomic error:&error];
if (!ok) {
NSLog(@"%s: Failed to write atomically to path %@: %@", __func__, path, error);
}
答案 1 :(得分:0)
好的,现在我意识到它与基本SDK无关。我清理了所有目标,现在问题随处可见。我尝试切换到使用NSUserDefaults而不是writeToFile:atomically:,并发生同样的问题。我无法理解这里有什么问题!
答案 2 :(得分:0)
如果它不适用于NSUserDefaults,则很可能您的字典中的对象不符合NSCoding。 你可以使用这样的东西来找出哪个密钥对此负责。当然,你也必须检查你的价值观。
for (id object in [dict allKeys])
if (![object conformsToProtocol:@protocol(NSCoding)])
NSLog(@"not NSCoding: %@ [%@]", object, [object class]);