设置 NSUserDefault 崩溃

Posted

技术标签:

【中文标题】设置 NSUserDefault 崩溃【英文标题】:Setting NSUserDefault crashing 【发布时间】: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。否则你可能会得到一个空引用 【参考方案1】:

这里的问题是 settingKey 是 null 值。

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

【讨论】:

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

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

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

【讨论】:

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

以上是关于设置 NSUserDefault 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

接收 NSUserDefault 时崩溃(保存数据)

如何为 NSUserDefault Keys 设置初始值?

nsuserdefault已经设置了key-values怎么删除呢?

iOS 中 关于 NSUserDefault中存储可变数组的问题

Swift 问题 - NSUserDefault 和 Settings Bundle 没有响应

在 NSUserDefault 中保存 NSMutableArray 给出 nil