在使用 NSMutableDictionary 的時候經(jīng)常會使用 setValue: forKey: 與
setObject: forKey:,他們經(jīng)常是可以交互使用的,代碼中經(jīng)常每一種的使用都有。
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 的一個類別,上面注釋說的很清楚,發(fā)送
setObject: forKey: 給接收者,也就是調(diào)用 setObject: forKey: 方法,
除非 value 為 nil 的時候,調(diào)用方法 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,只不過我們經(jīng)常使用 NSString 而已。
3、區(qū)別
- 1、
setObject: forkey:中object是不能夠為nil的,不然會報錯。
setValue: forKey:中value能夠為nil,但是當(dāng)value為nil的時候,會自動調(diào)用removeObject: forKey:方法。 - 2、
setValue: forKey:中key的參數(shù)只能夠是NSString類型,而
setObject: forkey:中的key可以是任何類型。
注意:
setObject: forkey:對象不能存放nil要與下面的這種情況區(qū)分:
1、
[NSNull null]表示的是一個空對象,并不是nil,如下:
[imageDictionary setObject:[NSNull null] forKey:indexNumber];
2、
setObject: forkey:中key是NSNumber對象的時候,如下:
[imageDictionary setObject:obj forKey:[NSNumber numberWithInt:10]];
4、最后
上面說的區(qū)別是針對調(diào)用者是 NSDictionary 而言的:
setObject: forKey:方法是NSMutabledictionary特有的setValue: forKey:方法是 KVC(鍵-值編碼)的主要方法
當(dāng) setValue: forKey: 方法調(diào)用者是對象的時候:
setValue: forKey: 方法是在 NSObject 對象中創(chuàng)建的,也就是說所有的 oc 對象都有這個方法,所以可以用于任何類。比如使用:
SomeClass *someObj = [[SomeClass alloc] init];
[someObj setValue:self forKey:@"delegate"];
表示的意思是:對象 someObj 設(shè)置它的 delegate 屬性的值為當(dāng)前類,當(dāng)然調(diào)用此方法的對象必須要有 delegate 屬性才能設(shè)置,不然調(diào)用了也沒效果。