【问题标题】:Problem writing to a plist写入 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];   
}

【问题讨论】:

    标签: iphone cocoa-touch plist nsmutabledictionary


    【解决方案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 调试随机崩溃也取得了很大成功。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-05
        • 1970-01-01
        • 1970-01-01
        • 2020-07-17
        相关资源
        最近更新 更多