valueForKey与objectForKey的恩怨情仇

最近项目中出现了一个奇怪的问题:

在两个5s下 tableview下的同一个列表,一个有重复数据,一个没有。 我是根据模型的 commentId来去重的。 degbug了一下,发现一个手机上显示的commentId是一个长整型,另外一个是负数长整型,由此我觉得有可能是因为我的模型commentId 是NSInteger的, id过大导致溢出了。改成了long long 后还是有这个问题。最后我开始排查,最后发现在解析的时候我用的是 [dict valueForKey:@"id"](额,不要问我为啥传的字段直接是id而不是具体的名字,后台不愿意改。。。。),这个方法把取出的是一个对象指针,然后我傻逼的直接把id类型的对象指针赋值给了一个整型数据,正确写法是:

commentId = [[dict objectForKey:@"id"] longLongValue];

希望同志们不要像我犯这样低级的错误。不过在排查的过程中,我了解了valueForKey与objectForKey的区别

  1. - (ObjectType)objectForKey:(KeyType)aKey 的官方说明是:Returns the value associated with a given key.

    • 返回值的说明:The value associated with aKey, or nil if no value is associated with aKey.
  2. *- (id)valueForKey:(NSString )key 的官方说明是:Returns the value for the property identified by a given key.The search pattern that valueForKey: uses to find the correct value to return.

    • 返回值的说明:The value for the property identified by key.

从官方说明中发现两个并没有什么差别,其实还是有细微的差别的

  1. - (id)valueForKey:(NSString )key是KVC (key-value coding)的,如果没有找到对应的key会调用-(id)valueForUndefinedKey:(NSString )key从而抛出 NSUndefinedKeyException 异常,而objectForKey一般会返回一个nil
  2. 当key中有 @ 符号开头时,只能用objectForKey,这个时候用valueForKey的话,会默认去除掉@符号,然后找不到对应的key,导致抛出 NSUndefinedKeyException 异常。

例如:
在没有@符号时,两种方法返回值是一样的

    [dict valueForKey:@"commentId"];
    [dict objectForKey:@"commentId"];

但是key中有@符号时

    [dict valueForKey:@"@commentId"];
    [dict objectForKey:@"@commentId"];//会抛出NSUndefinedKeyException异常

总结


所以在使用NSDictionary取值时,尽量使用objectForKey

你可能感兴趣的:(valueForKey与objectForKey的恩怨情仇)