setValue:forKey:与setObject:forKey:的区别

本文详细解析了KVC方法setValue:forKey:与setObject:forKey:的区别与联系,介绍了这两种方法如何处理nil值,以及它们与setValue:forKeyPath:和setObject:forKeyPath:的关系。此外还涉及了KVC对于只读属性赋值的特点。

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

// 苹果官方文档是这么解释的
/* Send -setObject:forKey: to the receiver, unless the value is nil, in which case send -removeObjectForKey:.*/
- (void)setValue:(nullable ObjectType)value forKey:(NSString *)key;

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

什么意思呢?

1. setValue:forKey: 要求传一个nullabel的value, 就是可以为nil;

上面也注释了,本质上也是调用 setObject:forKey: 但如果传的value是nil,就会移除这个key,对于可变字典这个机制叫做字典的有值添加;

2. setObject:forKey: 一般没有写nullabel 的,都是不可为空的,传入nil就会崩

为什么呢 你看文档中类的开头和结尾  NONNULL, 说的很清楚

NS_ASSUME_NONNULL_BEGIN

NS_ASSUME_NONNULL_END

3. setValue:forKeyPath:   AND  setObject:forKeyPath:

和上面那对方法类似,第一个参数意思一样,第二个更为精确;

举个栗子

[textField setValue:[UIColor blackColor] forKey:@"textColor"]; 

[textField setValue:[UIColor lightGrayColor] forKeyPath:@"_placeholderLabel.textColor"];

forKeyPath 可以通过点语法,给更深层的属性赋值

顺便说一下,KVC可以给readOnly 的属性赋值


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值