原文地址:http://blog.sheliw.com/blog/2014/11/26/valueforkey-vs-objectforkey/
访问NSDictionary时既可以使用字典内的方法objectForKey:
,也可以使用KVC的方法valueForKey:
。但是使用这两种方法有什么区别呢?
-
+ (id)valueForKey:(NSString *)key
的key必须是NSString型,- (id)objectForKey:(id)aKey
的key可以是id类型也就是任何NSObject的子类,不过这个key必须遵循NSCopying协议。 -
+ (id)valueForKey:(NSString *)key
作为一个KVC方法,可以适用于任何类,可以在运行时改变任何类的一个属性。其他语言很少能做到这一点。- (id)objectForKey:(id)aKey
只用于NSDictionary或者其子类。 -
+ (id)valueForKey:(NSString *)key
用于NSDictionary时,如果key不包含@,将会调用objectForKey:
。如果key包含@,将会调用[super valueForKey:]
,这就会导致如果key不存在时将会执行此方法valueForUndefinedKey:
并抛出异常。- (id)objectForKey:(id)aKey
在访问NSDictionary里不存在的key时。得到的object为nil。但是不会抛出异常。
如文档所说:
valueForKey:
Discussion:If key does not start with “@”, invokes
objectForKey:
. If key does start with “@”, strips the “@” and invokes[super valueForKey:]
with the rest of the key.
总之,从速度,安全性方面考虑我们应该在能用objectForKey:
的地方就不要用valueForKey:
。