写入 plist 的问题

Posted

技术标签:

【中文标题】写入 plist 的问题【英文标题】:Problem writing to a plist 【发布时间】:2009-07-14 21:18:20 【问题描述】:

一切正常,直到我调用 saveFile 方法(如下所示)将文件写回磁盘,然后它崩溃了。我做错了什么?

这是我打开文件的viewDidLoad 方法的一部分,效果很好。

//Get The Path
[self initPath];

dictionary = [[NSMutableDictionary alloc] initWithContentsOfFile:accountsFilePath];      

if (accountsArray == nil) 
    accountsArray = [[[NSMutableArray alloc]init] autorelease];


if (countArray == nil)      
    countArray = [[[NSMutableArray alloc]init] autorelease];


countArray = [dictionary objectForKey:@"count"];
accountsArray = [dictionary objectForKey:@"username"];

然后我将它加载到 tableview 中。然后我向其中添加了一些新项目,效果很好。然后我调用这个方法来保存它,它崩溃了:

-(void)saveFile 
    [dictionary setObject:accountsArray forKey:@"username"];
    [dictionary setObject:countArray forKey:@"count"];
    [dictionary writeToFile:accountsFilePath atomically:YES];   

【问题讨论】:

【参考方案1】:

您将在初始化 countArrayaccountsArray 之后自动释放它们。当您尝试保存它们时,它们很可能已经被释放。尝试为他们两个评论autorelease(并记住在某个地方发布它们,也许在dealloc 方法中)。

【讨论】:

【参考方案2】:

//如果找不到路径,文件没有加载,字典是nil怎么办

dictionary = [[NSMutableDictionary alloc] initWithContentsOfFile:accountsFilePath];

//第一次创建accountsArray,countArray

if (accountsArray == nil) 
    accountsArray = [[[NSMutableArray alloc]init] autorelease]; 

if (countArray == nil)      
    countArray = [[[NSMutableArray alloc]init] autorelease]; 

// 嘿为什么你又给accountsArray分配了一个新的,你刚刚初始化的旧的呢?

// 如果dictionary为nil,countarray也为nil

countArray = [dictionary objectForKey:@"count"];
accountsArray = [dictionary objectForKey:@"username"];

//// //// ///////////////////////////////////////// /////////////

你的崩溃信息是什么?

你的 accountsFilePath 是什么

你能看懂字典文件吗?

你可能想知道的一件事

writeToFile 不会为您创建新文件夹

所以accountsFilePath中的所有文件夹都是必须存在的。

否则您可能需要使用 nsfilemanager 创建该文件夹

【讨论】:

出于某种原因,我不知道为什么,它永远不会将文件路径保留在我设置的 var 中。奇怪......在我调用和创建它的方法中,我会做 NSLog 并且它会显示路径,但是当我在这个方法中做一个 NSLog 时,它会是空的。因此,我最终将该路径写入 userdefaults 并且它会读取它。我仍然想知道为什么它永远不会留在我为它创建的类 NSString var 中。令人费解!?【参考方案3】:

所有变量都在范围内吗?我假设 accountsFilePath 和 dictionary 是类变量?如果不是,他们可能会在 viewDidLoad 结束时死掉。

另一件可能会咬你的事情是你的字典容量太小,或者 iPhone 不喜欢你使用 setObject 方法来覆盖这样的键/值对。也许尝试调用 removeObjectForKey: 然后像上面一样添加回来?

【讨论】:

一切都在范围内,是的,您询问的文件是类变量。 setObject 行没有问题,它们可以工作。我可以只注释掉 [dictionary writeToFile:accountsFilePath atomically:YES] 行,一切都会正常工作,所以这是导致崩溃的最后一行。【参考方案4】:

您可能已经这样做了,但我会检查 gdb 中的字典和 accountsFilePath,或者在 writeToFile:atomically: 调用之前使用 NSLog。

您可能还想分享更多周边代码,以显示与这本词典相关的其他内容。

我一直在使用 NSZombie 调试随机崩溃也取得了很大成功。

【讨论】:

以上是关于写入 plist 的问题的主要内容,如果未能解决你的问题,请参考以下文章

.plist 文件写入失败!这段代码有啥问题?

如何将 NSMutableDictionary 写入 Plist

写入 plist 的问题

将数据写入 .plist

将嵌套字典写入 plist (Swift) 时的类型问题

写入 NSUserDefault 和 .plist 失败