在使用 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
屬性才能設置,不然調用了也沒效果。