今天看到一道這樣的面試題:
能準(zhǔn)確刪除“張三”的代碼是:NSMutableDictionary * dic =[NSMutableDictionary dictionaryWithObjectsAndKeys:@"張三",@"左護(hù)法", nil];
A. [dic removeObjectForKey:@"左護(hù)法"];
B. [dic removeObject:@"張三"];
C. [dic removeObjectAtIndex:0];
D. [dic removeAllObjects];
正確的答案是A,
dictionaryWithObjectsAndKeys:方法的功能是創(chuàng)建字典层宫,此字典具有多個(gè)值和多個(gè)鍵霉撵。與dictionaryWithObjects:唯一不同的是屎鳍,這多個(gè)值和鍵沒用放在數(shù)組中凭涂,而是直接進(jìn)行了使用匾寝。
我們查看了他的語法:+ (instancetype)dictionaryWithObjectsAndKeys:(id)firstObject, ... NS_REQUIRES_NIL_TERMINATION NS_SWIFT_UNAVAILABLE("Use dictionary literals instead");
其中咏窿,(id)firstObject用來指定值和鍵砖第,首位為值撤卢,第二位為鍵,第三位又為值梧兼,以此類推放吩。
值得注意的是:dictionaryWithObjectsAndKeys方法在遇到nil對象時(shí),會以為是最終的結(jié)束標(biāo)志羽杰。于是在初始化NSMutableDictionary的時(shí)候遇到有nil對象就會結(jié)束初始化了渡紫,而且不管編譯和運(yùn)行中都不會報(bào)錯,這樣的bug顯然很隱蔽考赛。
例如:
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:value1, @"key1", value2, @"key2", value3, @"key3", nil];
可能會發(fā)現(xiàn) dict 中沒有3個(gè)key-value對惕澎,原因是 dictionaryWithObjectsAndKeys 遇到 object 為 nil 時(shí)結(jié)束。
解決方式是在 object 可能為 nil 下, 使用 setObject:forKey:
1NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:10];
[dict setObject:value1 forKey:@"key1"];
[dict setObject:value2 forKey:@"key2"];
[dict setObject:value3 forKey:@"key3"];