在使用 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
而已。
3、区别
- 1、
setObject: forkey:
中object
是不能够为nil
的,不然会报错。
setValue: forKey:
中value
能够为nil
,但是当value
为nil
的时候,会自动调用removeObject: forKey:
方法。 - 2、
setValue: forKey:
中key
的参数只能够是NSString
类型,而
setObject: forkey:
中的key
可以是任何类型。
注意:
setObject: forkey:
对象不能存放nil
要与下面的这种情况区分:
1、
[NSNull null]
表示的是一个空对象,并不是nil
,如下:
[imageDictionary setObject:[NSNull null] forKey:indexNumber];
2、
setObject: forkey:
中key
是NSNumber
对象的时候,如下:
[imageDictionary setObject:obj forKey:[NSNumber numberWithInt:10]];
4、最后
上面说的区别是针对调用者是 NSDictionary
而言的:
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
属性才能设置,不然调用了也没效果。