setValue forKey和setObject forKey的区别

本文详细解析了NSMutableDictionary中setValue:forKey:与setObject:forKey:的区别,包括nil值处理方式的不同以及对key类型的限制。同时介绍了这两种方法在不同场景下的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在使用NSMutableDictionary的时候经常会使用setValue forKey与setObject forKey,他们经常是可以交互使用的,代码中经常每一种的使用都有。

1,先看看setValue: forKey:的定义

@interface NSMutableDictionary(NSKeyValueCoding)

/* Send -setObject:forKey: to the receiver, unless the value is nil, in which case send -removeObject:forKey:.

*/

- (void)setValue:(id)value forKey:(NSString *)key;

@end

扩展NSMutableDictionary的一个类别,上面注释说的很清楚,发送setObject:forKey 给接收者,也就是调用setObject:forKey方法

除非value为nil的时候,调用方法removeObject:forKey


2,看看setObject:forKey:的定义

@interface NSMutableDictionary :NSDictionary

- (void)removeObjectForKey:(id)aKey;

- (void)setObject:(id)anObject forKey:(id <NSCopying>)aKey;

@end

注意:setObject:forKey:中Key的对象是一个id类型,并不是NSString,只不过我们经常使用NSString而已。


现在总结他们2者的区别就是:

1, setObject:forkey:中value是不能够为nil的,不然会报错。

setValue:forKey:中value能够为nil,但是当value为nil的时候,会自动调用removeObject:forKey方法

2, setValue:forKey:中key的参数只能够是NSString类型,而setObject:forKey:的可以是任何类型


注意:setObject:forKey:对象不能存放nil要与下面的这种情况区分:

1, [imageDictionarysetObject:[NSNullnullforKey:indexNumber];

[NSNull null]表示的是一个空对象,并不是nil,注意这点


2, setObject:forKey:中Key是NSNumber对象的时候,如下:

    [imageDictionarysetObject:obj forKey:[NSNumber numberWithInt:10]];


注意:

上面说的区别是针对调用者是dictionary而言的。

setObject:forKey:方法NSMutabledictionary特有的,

setValue:forKey:方法是KVC(键-值编码)的主要方法。


当 setValue:forKey:方法调用者是对象的时候:

setValue:forKey:方法是在NSObject对象中创建的,也就是说所有的oc对象都有这个方法,所以可以用于任何类。

比如使用:

SomeClass *someObj = [[SomeClass alloc] init];

[someObj setValue:self forKey:@"delegate"];

表示的意思是:对象someObj设置他的delegate属性的值为当前类,当然调用此方法的对象必须要有delegate属性才能设置,不然调用了也没效果


引用中提到了在严格模式下使用map的function声明时,this指向undefined。这可能导致一些问题。解决方法是将map里面的function声明修改为箭头函数,因为箭头函数没有自己的this,它会继承父级作用域的this。这样就可以避免this指向undefined的问题。 引用中提到了setValue:ForKey:是KVC的主要方法,而setObject:ForKey:是NSMutableDictionary特有的方法。两者之间有一些区别。如果你是在使用NSMutableDictionary,应该使用setObject:ForKey:来设置对象的值。而如果你是在使用KVC,应该使用setValue:ForKey:来设置对象的值。 引用中提到了在GetNav方法中使用map遍历数组,并为每个元素动态生成一列数据,并为每一列数据添加了onClick事件。但在运行过程中报错说updateRoute为undefined。根据错误信息来看,可能是updateRoute这个方法未定义。需要检查代码中是否有定义这个方法,并且确保被正确引用。 综上所述,问题的解决方法包括: 1. 将map里面的function声明修改为箭头函数,以解决严格模式下this指向undefined的问题。 2. 根据具体情况选择使用setValue:ForKey:或setObject:ForKey:方法来设置对象的值。 3. 检查代码中是否正确定义了updateRoute方法,并确保正确引用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [TypeError:Cannot read properties of undefined(reading XXX)](https://blog.youkuaiyun.com/qq_57558631/article/details/124961465)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [iOS中setValuesetObject区别详解](https://download.youkuaiyun.com/download/weixin_38701407/12786722)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值