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

xiaoxiao2021-02-28  54

// 苹果官方文档是这么解释的 /* 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 的属性赋值

转载请注明原文地址: https://www.6miu.com/read-75501.html

最新回复(0)