美文网首页iOS 深度好文iOS Developer
iOS-NSDictionary的objectForKey和va

iOS-NSDictionary的objectForKey和va

作者: 你的小福蝶 | 来源:发表于2017-06-17 10:31 被阅读412次

    NSDictionary取值的时候有两个方法,objectForKey:和valueForKey:

    在这里我们来简单研究一下它们的区别!

    示例一:

    NSDictionary*dict = [NSDictionarydictionaryWithObject:@"theValue"forKey:@"theKey"];

    NSString*value1 = [dictobjectForKey:@"theKey"];

    NSString*value2 = [dictvalueForKey:@"theKey"];

    这时候获取到的value1和value2是一样的结果。


    示例二:

    NSDictionary*dict = [NSDictionarydictionaryWithObject:@"theValue"forKey:@"@theKey"];//注意此处key是以@开头

    NSString*value1 = [dictobjectForKey:@"@theKey"];

    NSString*value2 = [dictvalueForKey:@"@theKey"];

    这时候value1可以正确取值,但是value2取值会直接crash掉,报错信息:

    Terminating app due to uncaught exception ‘NSUnknownKeyException’, reason: ‘[<__NSCFDictionary0x892fd80> valueForUndefinedKey:]: this class is not key value coding-compliantforthe key theKey.’

    这是因为valueForKey:是KVC(NSKeyValueCoding)的方法,在KVC里可以通过property同名字符串来获取对应的值。比如:

    valueForKey:取值是找和指定key同名的property accessor,没有的时候执行valueForUndefinedKey:,而valueForUndefinedKey:的默认实现是抛出NSUndefinedKeyException异常。

    回过头来看刚才crash的例子,[dict valueForKey:@"@theKey"];会把key里的@去掉,也就变成了[dict valueForKey:@"theKey"];,而dict不存在theKey这样的property,转而执行[dict valueForUndefinedKey:@"theKey"];,抛出NSUndefinedKeyException异常后crash掉。

    总结:

    objectForKey: 和 valueForKey: 在多数情况下都是一样的结果返回,但是如果 key 是以 @ 开头,valueForKey: 就成了一个大坑,建议在 NSDictionary 下只用 objectForKey: 来取值。

    原文链接

    相关文章

      网友评论

        本文标题:iOS-NSDictionary的objectForKey和va

        本文链接:https://www.haomeiwen.com/subject/wfvvqxtx.html