writeToFile:atomically:不在4.1 SDK及以下版本中工作,但适用于4.2 beta SDK

时间:2010-10-23 04:44:52

标签: iphone

我使用以下代码写入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。这有什么不对?

3 个答案:

答案 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]);