iOS之'mutating method sent to immutable object'
2016-05-06 15:58
405 查看
今天在代码测试中发现以下代码:
执行后错误信息如下:
2016-05-06 15:12:18.566[5054:105571] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[__NSCFDictionary setObject:forKey:]: mutating method sent to immutable object'
*** First throw call stack:
(
0 CoreFoundation 0x000000010f312d85 __exceptionPreprocess + 165
1 libobjc.A.dylib 0x000000010ed86deb objc_exception_throw + 48
2 CoreFoundation 0x000000010f312cbd +[NSException raise:format:] + 205
3 CoreFoundation 0x000000010f239133 -[__NSCFDictionary setObject:forKey:] + 99
4 Proj 0x0000000109ef641b +[AppDelegate aaaaa] + 3083
原来:userDefaults objectForKey: 返回的是一个不可变对象(immutable object),有人可能会想到创建一个可变对象或进行类型强制转换,
其实这是不被推荐的,官方建议写法:
NSMutableDictionary *gesture = [(NSMutableDictionary*) [[NSUserDefaults standardUserDefaults] objectForKey:Lock_Gesture_Dic] mutableCopy];
// 更新本地缓存 NSMutableDictionary *gesture = (NSMutableDictionary *)[[NSUserDefaults standardUserDefaults] objectForKey:Lock_Gesture_Dic]; [gesture setValue:self.access_token forKey:Lock_Access_Token];
执行后错误信息如下:
2016-05-06 15:12:18.566[5054:105571] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[__NSCFDictionary setObject:forKey:]: mutating method sent to immutable object'
*** First throw call stack:
(
0 CoreFoundation 0x000000010f312d85 __exceptionPreprocess + 165
1 libobjc.A.dylib 0x000000010ed86deb objc_exception_throw + 48
2 CoreFoundation 0x000000010f312cbd +[NSException raise:format:] + 205
3 CoreFoundation 0x000000010f239133 -[__NSCFDictionary setObject:forKey:] + 99
4 Proj 0x0000000109ef641b +[AppDelegate aaaaa] + 3083
原来:userDefaults objectForKey: 返回的是一个不可变对象(immutable object),有人可能会想到创建一个可变对象或进行类型强制转换,
其实这是不被推荐的,官方建议写法:
NSMutableDictionary *gesture = [(NSMutableDictionary*) [[NSUserDefaults standardUserDefaults] objectForKey:Lock_Gesture_Dic] mutableCopy];
相关文章推荐
- error LNK2019: 无法解析的外部符号 __imp_DeleteObject
- Programming with Objective-C(五)
- 关于List<Map<String,Object>>的通俗解释
- JS中六种数据类型(六)——Object
- 将json格式的字符串转化成object对象
- Object-c------protocol
- Object-c------block
- 解决ImportError: libmysqlclient_r.so.16: cannot open shared object file
- objective-c - 基础篇 - UIWebView
- Hibernate:deleted object would be re-saved by cascade (remove deleted object from associations): []
- Object-c字符串操作
- 【Json】关于json解析时异常org.json.JSONException: A JSONObject text must begin with '{' at character 1 of {的解决方法
- Orocos DataPort 解析: orocos lock free data object
- inside the c++ object
- Objective-C的属性和成员变量用法及关系浅析
- iPhone开发:Objective C 代码规范-iOS总结版
- JsonConvert.DeserializeObject 的用法
- Objective-C的缓存框架EGOCache在iOS App开发中的使用
- 多线程-wait(针对OBJECT对象锁的方式)
- asp 提示 没有权限: 'CreateObject'