iOS之NSMutableDictionary导致程序崩溃:'NSInternalInconsistencyException'

使用NSMutableDictionary时,如果操作不当,有可能会引起程序崩溃。示例代码:

NSString *result = @"{\"username\”:\”aaa\”,\"phone\":\"15666666666\",\"bankcount\":\"98765432112345678\"}";
NSData *data = [result dataUsingEncoding:NSUTF8StringEncoding];
NSMutableDictionary *info = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
if (info) {
    NSString *username = [Utils UrlDecode: info[@"username"]];
    [info  setObject:username forKey:@"username"];
}

执行上述代码后报错:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[__NSCFDictionary setObject:forKey:]: mutating method sent to immutable object'

出错原因在于:

[NSJSONSerialization
JSONObjectWithData:data options:NSJSONReadingMutableLeaves
error:nil];

返回的结果是immutable对象,不能直接对immutable进行赋值操作,否则会报错。

修改后代码:

NSString *result = @"{\"username\”:\”aaa\”,\"phone\":\"15666666666\",\"bankcount\":\"98765432112345678\"}";
NSData *data = [result dataUsingEncoding:NSUTF8StringEncoding];
//----将immutable转换为mutable----
NSMutableDictionary *temp = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
NSMutableDictionary *info = [NSMutableDictionary dictionaryWithDictionary:temp];
//----------------------
if (info) {
    NSString *username = [Utils UrlDecode:info[@"username"]];
    [info  setObject:username forKey:@"username"];
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

iOS之NSMutableDictionary导致程序崩溃:'NSInternalInconsistencyException'

时间: 2024-10-15 17:56:15

iOS之NSMutableDictionary导致程序崩溃:'NSInternalInconsistencyException'的相关文章

解决Qt中QTableWidget类方法setItem 时导致程序崩溃问题

在为一个音乐播放器增加功能时莫明奇妙的出现程序崩溃,定位到是由于QTableWidget 的setItem方法导致的,最终在此处找到了解决方式. 大致是说不能在setItem之前连接cellChanged 信号,把连接cellChanged信号的语句放置在一连串的setItem(在表格插入一行后调用的)之后就可以了. 解决Qt中QTableWidget类方法setItem 时导致程序崩溃问题

WPF 线程中异常导致程序崩溃

原文:WPF 线程中异常导致程序崩溃 一般我们WPF中都加全局捕获,避免出现异常导致崩溃. Application.Current.DispatcherUnhandledException += Current_DispatcherUnhandledException; AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException)

setSupportActionBar(toolbar)导致程序崩溃闪退

最近在做一个项目,使用了第三方的开源项目,主要是想实现android5.0之后推出的MaterialDesign的风格,但是代码已经写好了,发现一运行就闪退,所以就开始debug,发现问题出现在 1 Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 2 setSupportActionBar(toolbar); 很显然应该是在第二行出错了,再根据logcat上的日志: This Activity already has an acti

综合经验:IO读写错误必然导致程序崩溃

仿佛是忽然间产生的问题,每次程序退出时候,必然崩溃,花了整整一天才找到原因,就是对数据库的IO读写错误.主要是因为析构函数调用了Disconnect函数,内容如下: void SFTPTool::Disconnect() { if (!m_valided) IsCompteValide(); if (!m_valided) { return; } QString strModule = "soft"; if (!m_taskname.isEmpty()) strModule = m_t

Android中继承的Dialog导致程序崩溃

============问题描述============ 在一个自己定义的View中,当点击屏幕时弹出一个对话框,结果每次程序都会被强制关闭. View中的onTouchEvent()方法: public boolean onTouchEvent(MotionEvent event) { //Log.i("sudu002", "done!!!!!!!!!!!!!!!!!"); if(event.getAction() != event.ACTION_DOWN) re

Android While 循环导致的资源占用过高进而导致程序崩溃问题

Timeline: Activity_launch_request time:6562004-14 15:31:25.347: I/dalvikvm(3483): Total arena pages for JIT: 1104-14 15:31:25.621: D/dalvikvm(3483): JIT unchain all for threadid=1304-14 15:31:26.371: W/dalvikvm(3483): threadid=1: spin on suspend #1 t

整型输入如果替换成字符导致程序崩溃

p = (LinkList)malloc(sizeof(LinkNode));  p->next = NULL;  scanf("%d", &p->data);  if (0 == p->data)//输入0表示结束输入  {   free(p);   break;  } 应该是从字符串中提取的方式.

iOS开发-捕获程序崩溃日志

iOS开发中遇到程序崩溃是很正常的事情,如何在程序崩溃时捕获到异常信息并通知开发者? 下面就介绍如何在iOS中实现: 1. 在程序启动时加上一个异常捕获监听,用来处理程序崩溃时的回调动作 1 NSSetUncaughtExceptionHandler (&UncaughtExceptionHandler); 官方文档介绍:Sets the top-level error-handling function where you can perform last-minute logging bef

iOS 中捕获程序崩溃日志

iOS开发中遇到程序崩溃是很正常的事情,如何在程序崩溃时捕获到异常信息并通知开发者,是大多数软件都选择的方法.下面就介绍如何在iOS中实现: 1. 在程序启动时加上一个异常捕获监听,用来处理程序崩溃时的回调动作  NSSetUncaughtExceptionHandler (&UncaughtExceptionHandler);  官方文档介绍:Sets the top-level error-handling function where you can perform last-minute