2010-10-23 40 views
2

我用下面的代码写入到plist中(已填充假设字典)工作原理:在我的应用程序委托将writeToFile:原子:不是4.1 SDK的工作和下方,但在4.2测试版SDK

[dict writeToFile:[appDelegate dataFilePath] atomically:YES]; 

哪里:

- (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]]; 

编译我的AP时,该工作p为4.2,但由于我把它分配到4.1分配,它停止工作。

[dict writeToFile:[appDelegate dataFilePath] atomically:YES]; 

返回NO。这里有什么问题?

+0

iOS 4.2是一个测试版,你不能在苹果自己的论坛中讨论任何其他地方。 – Emil 2010-10-23 13:07:28

+0

我知道。但从那以后,我意识到这与SDK版本的差异毫无关系。 – quantum 2010-10-29 00:00:32

回答

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); 
} 
0

好吧,现在我意识到这无关与基地SDK。我清理了所有目标,现在问题无处不在。我尝试切换到使用NSUserDefaults而不是writeToFile:atomically:,并且发生同样的问题。我无法理解这里有什么问题!

0

如果它不适用于NSUserDefaults,那么您的字典中很可能有不符合NSCoding的对象。 你可以使用类似的东西来找出哪个键负责这个。当然你也必须检查你的值。

for (id object in [dict allKeys]) 
    if (![object conformsToProtocol:@protocol(NSCoding)]) 
     NSLog(@"not NSCoding: %@ [%@]", object, [object class]); 
相关问题