2018-05-05 Objective-C中的dictionaryWithObjectsAndKeys:方法使用

今天看到一道这样的面试题:
能准确删除“张三”的代码是: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"];

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容