尝试在 NSMuableDictionary 中设置值时应用程序崩溃

Posted

技术标签:

【中文标题】尝试在 NSMuableDictionary 中设置值时应用程序崩溃【英文标题】:App crashing when trying to setValue in NSMuableDictionary 【发布时间】:2015-07-17 06:32:54 【问题描述】:

当我尝试在 NSMutableDictionary 中设置值时,我的应用程序崩溃了。

下面是演示崩溃的代码,我在控制台中也找不到任何崩溃日志。

NSArray *b =[[a objectAtIndex:1] valueForKey:@"value"];
NSMutableDictionary *b1 =[b objectAtIndex:0];
NSString *str = self.tes;
[b1 setValue:str forKey:@"value"];

请帮我解决这个问题。

b1 字典日志


    question = "vale";
    type = a;

【问题讨论】:

什么是 b1 字典添加日志与您的问题。 我已经在问题中添加了日志 NSMutableDictionary *b1 = [NSMutableDictionary alloc] initWithDictionary:[b objectAtIndex:0]];试试这个 请按照@jogshardik 所说的进行尝试。 (Y) 它使用公共内存位置来访问数据并更新同一内存位置中的值。我们不能分配初始化字典 【参考方案1】:

setValue:forKey:NSKeyValueCoding 协议的一部分,除其他外,它允许您从 Interface Builder 之类的访问对象属性。 setValue:forKey: 在 NSDictionary 以外的类中实现。

setObject:forKey:NSMutableDictionary 存在的理由。它的签名恰好与setValue:forKey: 非常相似,但更通用(例如任何密钥类型)。

因此,在您的情况下,只需将所有 setValue:forKey 替换为 setObject:forKey 并将 valueForKey: 替换为 objectForKey:

--

Difference between objectForKey and valueForKey?

【讨论】:

使用setValue:forKey: 实际上更安全,因为它通过删除键来处理nil 值。另一方面,setObject:forKey: 会抛出异常并可能导致应用程序崩溃。 我更喜欢处理nil 值而不是收集奇怪的错误:) 什么错误?它是NSMutableDictionary 的定义和记录的行为。也有道理:如果您将nil 设置为@"key",那么获取@"key" 的值应该是nil(不存在)。【参考方案2】:

所以你说你遇到了EXC_BAD_ACCESS 崩溃。尝试在 Xcode 的 Scheme 编辑器中打开 Zombies。见Enable and Debug Zombie objects in ios using Xcode 5.1.1。该问题解释了如何使用它,但您不需要运行其中提到的 Instruments。

然后运行应用程序,Xcode 会告诉你EXC_BAD_ACCESS 的原因。不要忘记在不需要时将僵尸关闭

Zombie这个名字来源于这样一个事实,在这种模式下,所有被释放的对象都将被标记并保存为特殊的内存区域(不是活的,不是死的,僵尸)。一旦您的代码尝试使用此类释放的对象,Xcode 会注意到并打印有用的消息。

【讨论】:

启用 zoombie 也没有为我提供任何解决方案.. :( 我认为问题在于 ios 中的内存分配。你能检查一下吗?

以上是关于尝试在 NSMuableDictionary 中设置值时应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

尝试在 Swift 5 中设置 UISearchController 的背景颜色

在调用 awakeFromNib 之前尝试在 UIView 中设置属性

尝试在 lambda 函数中设置按钮标签时出现分段错误

尝试在 UIScrollview 中设置宽图像,高度固定

尝试在 WPF 中设置组合框的背景

尝试在 Eclipse 中设置调试配置时未显示项目