iOS -setValue:forKey:和-setObject: forKey区别
来源:互联网 发布:软件开发解决方案总结 编辑:程序博客网 时间:2024/05/22 18:55
首先看一下下面的代码,请问程序是否会崩溃?如果不会,那么输出结果应该是什么?
NSMutableDictionary * dic = [@{@"name":@"小明"} mutableCopy];[dic setObject:@"Men" forKey:@"gender"];[dic setValue:nil forKey:@"gender"];NSLog(@" -- %@ -- ",dic);
既然问到了输出结果,如果你不是很确定答案的话,应该可以猜出来程序是不会崩溃的。
下面就打个断点来看dic走完每一行代码后的结果:
-setValue: forKey: 是KVC(键-值编码)提供的方法,旨在通过key去修改一个obj的属性,如果是字典的话,则修改key对应的value,如果是数组或者集合,则会向每个对象发送此消息,去修改元素的key对应的property。
说到这里就不得不提一下:如果向一个对象a发送-satValue: forKey:消息,除非能确保a包含key对应的property(即key和A的某个property名字相同),否则必须实现类A或者其父类的-setValue: forUndefinedKey:方法,否则会导致crash。
/* Send -setObject:forKey: to the receiver, unless the value is nil, in which case send -removeObjectForKey:.*/- (void)setValue:(nullable ObjectType)value forKey:(NSString *)key;
按照其注释:给消息接受者发送-setObject:forKey: 消息,如果value为nil,则给消息接受者发送-removeObjectForKey:消息。
-setObject: forKey: 是NSMutableDictionary的对象方法,旨在通过去修改字典中key对应的value,如果key不存在,则添加此key-value对。
值得注意的是,为了使你的程序更加strong,当你调用-setObject: forKey:时,务必对object进行判空,只有当object不为nil时方可调用该方法,否则会导致程序crash。
NSMutableDictionary * dic = [@{@"name":@"小明"} mutableCopy]; //_gender是一个全局变量 //当_gender为nil时,执行到此将会crash// [dic setObject:_gender forKey:@"gender"]; //为避免此类crash,需要对_gender进行判空,如此就不会crash了,只是你从字典里可能得不到想要的信息,与crash相比,此举的用户体验要比crash强得太多了 if (_gender) [dic setObject:_gender forKey:@"gender"];
总结一下吧
相同点:
- 二者都可以对可变字典进行修改;
不同点:
- -setValue:forKey:是KVC提供的方法,可对绝大部分对象进行操作(包括自定义对象),-setObject: forKey是NSMutableDictionary提供的方法,只能操作可变字典;
- -setValue:forKey:当value为nil时,对于字典相当于删除key-value对,-setObject: forKey当object为nil时将直接导致程序crash,因此调用之前需要判空;
0 0
- iOS -setValue:forKey:和-setObject: forKey区别
- iOS开发66-setValue:forKey:和 setObject:forKey:的区别
- setValue forKey和setObject forKey的区别
- setValue: forKey 和 setObject: forkey的区别
- SetValue:forKey和SetObject:forKey的区别
- setValue: forKey 和 setObject: forKey 的区别
- setValue forKey 和 setObject forKey
- setValue:forKey:与setObject:forKey:的区别
- iOS开发中setObject:ForKey和setValue:ForKey的用法和区别
- setValue: forkey与 setObject区别
- setValue:forKey:与setObject:forKey:
- 字典方法setValue:ForKey setObject:ForKey的区别
- setObject:ForKey:与setValue:ForKey:的区别与联系
- setObject:ForKey:与setValue:ForKey:存值区别与联系
- kvc和字典在创建键值对时的相同与区别(setValue forKey )(setObject forKey)
- setValue:forKey与setObject:forKey的差异
- setValue:forKey与setObject:forKey的差异
- setValue:forKey与setObject:forKey的差异
- 用几何画板演示高尔顿钉板动画
- 项目管理工具 Open Project 介绍
- linphone 手机上不能接听电话
- BitmapFactory的decodeStream()方法导致InputStream失效的问题
- 机器学习入门资源不完全汇总
- iOS -setValue:forKey:和-setObject: forKey区别
- linux的硬链接与软链接
- ios聊天对话显示的UITableView扩展
- 面向对象的OOA、OOD、OOP
- cat命令
- LintCode 用递归打印数字
- Altium Designer使用技巧总结
- Glide使用心得——加载图片出现浅绿色背景问题和Glide加载完成的监听设置
- thrift TSocket read 0 bytes(string类型中的一个坑)