写入 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】:您将在初始化 countArray
和 accountsArray
之后自动释放它们。当您尝试保存它们时,它们很可能已经被释放。尝试为他们两个评论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 的问题的主要内容,如果未能解决你的问题,请参考以下文章