3

NSUserDefaults. 我第一次读它很好。我得到数据并且没问题。第二次,我崩溃了/我得到了空值。

我已经检查过的事情:

  • 不,我不会在其他地方删除它。
  • 不,没有其他人同时调用它。
  • 如果它为零?它不应该是零,也没有我擦除它的地方,并且在第一次(有数据)和第二次(崩溃)之间,甚至没有人触摸它。
  • 它节省NSMutableArrayNSData,它可能很好,因为它在第一次调用时起作用。

会是什么呢?

return [[NSUserDefaults standardUserDefaults]objectForKey:@"tempImagesArray"];

我什至没有放代码来保存它,因为我在第一次启动应用程序时保存了它,第二次我什至没有保存任何东西,它从上次在内存中就在那里。(它在第一次调用而不是在第二次调用)

编辑::: 我在崩溃时看到的汇编程序:

0x19f8e2c:  movl   %eax, (%esp)
0x19f8e2f:  calll  0x1bcdfee                 ; symbol stub for: objc_msgSend
0x19f8e34:  jmp    0x19f8e38                 ; -[NSUserDefaults(NSUserDefaults) objectForKey:] + 74
0x19f8e36:  xorl   %eax, %eax
0x19f8e38:  addl   $20, %esp
4

1 回答 1

0

我想到了几件事:

  • 您是[[NSUserDefaults standardUserDefaults] synchronize]在将数组设置为默认字典后调用吗?

Obs.:正如您的代码显示的那样NSMutableArray,我只想指出这一点(根据 Apple 的文档):

从 NSUserDefaults 返回的值是不可变的,即使您将可变对象设置为值。例如,如果您将可变字符串设置为“MyStringDefault”的值,那么您稍后使用 stringForKey: 检索的字符串将是不可变的。

  • 您存储的数据是否太大?我在 NSUserDefaults 上找不到实际“数据过多”的定义,但我猜如果数据集太大,可能会发生奇怪的事情。您是否可以尝试将这些数据存储在文件中?这个 SO answer有一个非常简单的解决方案。
于 2013-04-24T22:32:08.357 回答