【问题标题】:Setting NSUserDefault crashing设置 NSUserDefault 崩溃
【发布时间】:2013-07-18 14:13:11
【问题描述】:

我在用户默认值中设置了一个值,但我不知道它为什么会崩溃:

[[NSUserDefaults standardUserDefaults] setObject:[textField text] forKey:@"STRING"];

这很好,但是

[[NSUserDefaults standardUserDefaults] setObject:[textField text] forKey:settingKey];

这不是。 settingKey 是我正在使用的类中声明和合成的属性。事实上,即使这一行也有效

[textField setText:[[NSUserDefaults standardUserDefaults] objectForKey:settingKey]];

当模拟器崩溃时,它会将我带到我无法理解的核心基础哈希 (CFHash):

0x1c24756: call 0x1d79a00; symbol stub for: getpid

"Thread 1: EXC_BREAKPOINT (code=EXC_1386_BPT, subcode=0x0)"

【问题讨论】:

  • 什么是settingKey?是NSString之类的吗?
  • 你在处理多个线程吗?
  • settingsKey 还是 settingKey ? (您的代码示例显示两者)
  • 它是settingKey,一个NSString。对于那个很抱歉。并不是说我知道我没有使用任何其他线程。
  • 我不知道你是如何合成它的,但如果 settingKey 是一个属性,你应该使用 self.settingKey 或类似@synthesize settingKey = _settingKey;然后在您的代码中使用 _settingKey。否则你可能会得到一个空引用

标签: ios objective-c nsuserdefaults


【解决方案1】:

这里的问题是 settingKey 是 null 值。

if you are trying to set null value as an key arguement then it'l happend.

【讨论】:

  • 嗯,我测试过它确实是空的......但它绝对不应该。谢谢!
  • @乐家聪:欢迎亲,如果对你有用的话就采纳吧。
【解决方案2】:

我不确定您的密钥到底是什么类型的对象,因此崩溃可能是由以下两个问题之一引起的:

  1. settingKey 不是可以存储在 NSDictionary 中的对象。存储在 NSUserDefaults 中的任何键及其值都必须是 NSString、NSInteger 等。它不能是像 int 或 BOOL 这样的原始数据类型。更具体地说,键必须是 NSString。
  2. settingKeyNULL,尚未分配,或已过早释放,则 NSUserDefaults 将导致崩溃。 NSUserDefaults(或 NSDictionaries)中的键不能为 NULL

【讨论】:

  • “NSCoding compliant”意味着给定的类具有某些键的访问器。密钥本身不需要符合 NSCoding 标准——为了证明这一点,请查看 NSString 文档—— NSString 不符合 NSCoding 标准。你说得对,键必须是对象——事实上,对于 NSUserDefaults,键必须是字符串——但 NSCoding 不是原因。
  • @Caleb 哎呀!感谢您提供的信息 - 似乎我误解了 NSCoding 文档。我会仔细阅读它。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-15
  • 2011-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多