2018-05-05 Objective-C中的diction
今天看到一道这样的面试题:
能准确删除“张三”的代码是:NSMutableDictionary * dic =[NSMutableDictionary dictionaryWithObjectsAndKeys:@"张三",@"左护法", nil];
A. [dic removeObjectForKey:@"左护法"];
B. [dic removeObject:@"张三"];
C. [dic removeObjectAtIndex:0];
D. [dic removeAllObjects];
正确的答案是A,
dictionaryWithObjectsAndKeys:方法的功能是创建字典,此字典具有多个值和多个键。与dictionaryWithObjects:唯一不同的是,这多个值和键没用放在数组中,而是直接进行了使用。
我们查看了他的语法:+ (instancetype)dictionaryWithObjectsAndKeys:(id)firstObject, ... NS_REQUIRES_NIL_TERMINATION NS_SWIFT_UNAVAILABLE("Use dictionary literals instead");
其中,(id)firstObject用来指定值和键,首位为值,第二位为键,第三位又为值,以此类推。
值得注意的是:dictionaryWithObjectsAndKeys方法在遇到nil对象时,会以为是最终的结束标志。于是在初始化NSMutableDictionary的时候遇到有nil对象就会结束初始化了,而且不管编译和运行中都不会报错,这样的bug显然很隐蔽。
例如:
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:value1, @"key1", value2, @"key2", value3, @"key3", nil];
可能会发现 dict 中没有3个key-value对,原因是 dictionaryWithObjectsAndKeys 遇到 object 为 nil 时结束。
解决方式是在 object 可能为 nil 下, 使用 setObject:forKey:
1NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:10];
[dict setObject:value1 forKey:@"key1"];
[dict setObject:value2 forKey:@"key2"];
[dict setObject:value3 forKey:@"key3"];