在我们平时的编程经历中用了许多的setObject:forKey: 与setValue: forKey。平时用的时候一般不会注意这两个方法有什么区别,有什么共同点,下边来look look。
1.在Xcode中cmd点进去看官方定义,可以发现,两个方法还是有联系和细微区别的,
- - (void)setObject:(ObjectType)anObject forKey:(KeyType <NSCopying>)aKey;
可以发现setObject:是set了一个对象类型的数据。
- @interface NSMutableDictionary<KeyType, ObjectType>(NSKeyValueCoding)
/* Send -setObject:forKey: to the receiver, unless the value is nil, in which case send -removeObjectForKey:.*/
- (void)setValue:(nullable ObjectType)value forKey:(NSString *)key;
setValue相当于扩展了一个NSMUtableDictionary的一个类别,注释的意思是发送setObject给接收者,调用的也是setObject:forkey方法。但是当这个value为nil的时候,则自动调用removeObject:forkey
2.再说说他们的区别
- setObject是NSMutableDictionary独有的方法,setValue则是KVC的主要方法。并且setValue的调用对象可以是任何类,以此来处理自身的属性。
- 如果setObject:nil,这样会会直接crash崩溃;但是setvalue的时候,如果为nil,系统会自动调用removeObject:forKey方法,就没这个问题了,但是不好检测。
PS:如果setObject:[NSNull null] forKey。这样是没问题的,因为[NSNull null]是一个对象
setValue只能set一个NSString类型的数据,但是setObject却可以是任何类型