在使用NSMutableDictionary的時(shí)候經(jīng)常會(huì)使用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
擴(kuò)展NSMutableDictionary的一個(gè)類別概龄,上面注釋說的很清楚馒铃,發(fā)送setObject:forKey 給接收者,也就是調(diào)用setObject:forKey方法除非value為nil的時(shí)候栅迄,調(diào)用方法removeObject:forKey
2,看看setObject:forKey:的定義
@interface NSMutableDictionary :NSDictionary
- (void)removeObjectForKey:(id)aKey;
- (void)setObject:(id)anObject forKey:(id)aKey;
@end
注意:setObject:forKey:中Key的對(duì)象是一個(gè)id類型站故,并不是NSString,只不過我們經(jīng)常使用NSString而已毅舆。
現(xiàn)在總結(jié)他們2者的區(qū)別就是:
1, setObject:forkey:中value是不能夠?yàn)閚il的西篓,不然會(huì)報(bào)錯(cuò)。
setValue:forKey:中value能夠?yàn)閚il憋活,但是當(dāng)value為nil的時(shí)候岂津,會(huì)自動(dòng)調(diào)用removeObject:forKey方法
2, setValue:forKey:中key的參數(shù)只能夠是NSString類型,而setObject:forKey:的可以是任何類型
注意:setObject:forKey:對(duì)象不能存放nil要與下面的這種情況區(qū)分:
1, [imageDictionarysetObject:[NSNullnull] forKey:indexNumber];
[NSNull null]表示的是一個(gè)空對(duì)象悦即,并不是nil寸爆,注意這點(diǎn)
2, setObject:forKey:中Key是NSNumber對(duì)象的時(shí)候,如下:
[imageDictionarysetObject:obj forKey:[NSNumber numberWithInt:10]];
注意:
上面說的區(qū)別是針對(duì)調(diào)用者是dictionary而言的盐欺。
setObject:forKey:方法NSMutabledictionary特有的,而
setValue:forKey:方法是KVC(鍵-值編碼)的主要方法。
當(dāng) setValue:forKey:方法調(diào)用者是對(duì)象的時(shí)候:
setValue:forKey:方法是在NSObject對(duì)象中創(chuàng)建的仅醇,也就是說所有的oc對(duì)象都有這個(gè)方法冗美,所以可以用于任何類。
比如使用:
SomeClass *someObj = [[SomeClass alloc] init];
[someObj setValue:self forKey:@"delegate"];
表示的意思是:對(duì)象someObj設(shè)置他的delegate屬性的值為當(dāng)前類析二,當(dāng)然調(diào)用此方法的對(duì)象必須要有delegate屬性才能設(shè)置粉洼,不然調(diào)用了也沒效果