Objective-C 属性在运行时解析为什么?调用 [obj valueForKey:@"property"] 总是会产生相同的结果吗?
例如
对象属性
Objective-C 属性在运行时解析为什么?调用 [obj valueForKey:@"property"] 总是会产生相同的结果吗?
例如
对象属性
首先,请注意obj.property
与 完全相同[obj property]
。点语法只是语法糖。虽然有一些与其他方法不同的属性相关的小的运行时实现细节,但出于讨论的目的,请仅考虑“我有一个名为 ivar_key
和一个名为 的方法” -key
。您通过声明属性创建了 ivar 和方法这一事实与valueForKey:
.
valueForKey:
是一种方法,它可以被一个类覆盖以返回它喜欢的任何东西。默认行为是valueForKey:
首先查找名称与键匹配的方法,然后返回结果。在绝大多数情况下,这意味着如果你有一个属性,那么valueForKey:@"property"
将返回它的值。
默认实现的完整搜索路径valueForKey:
在“访问器搜索实现细节”中进行了说明,但这里是“短”版本:
get<Key>
, <key>
, is<Key>
(是的,它看起来的第一个位置是getKey
,这有点令人尴尬,因为get
除非它们通过引用返回值,否则您不应该在 getter 前加上前缀,但您就可以了;这是检查的第一件事。)
countOf<Key>
, objectIn<Key>AtIndex:
, 和<key>AtIndexes
. 如果找到这些的合法组合,则返回一个类似 NSArray 的代理对象。
countOf<Key>
, enumeratorOf<Key>
, 和memberOf<Key>:
. 如果找到所有三个,则返回一个类似 NSSet 的代理对象。
如果accessInstanceVariablesDirectly
是YES
(默认值),则检查 ivars,命名为_<key>
、_is<Key>
、<key>
或is<Key>
。是的,这是一种访问对象私有 ivars 的方法。
如果其他一切都失败了,那么它会调用valueForUndefinedKey:
,它可以自由地返回一个结果(如果你想要一个通用的键/值存储,这实际上是一件非常有用的事情)。
但是十分之九,您将获得名为 的方法的值<key>
。
旁注:valueForKey:
返回一个对象。如果返回是一个类似数字的标量(包括BOOL
),它将返回一个NSNumber
. 否则它将返回一个NSValue
. NSPoint
, NSRange
,NSRect
和NSSize
(在 Mac 上;在 iOS 上,NSRange
我相信只有特别处理) 有一些特殊处理。
obj.property 与 [obj property] 相同,而不是 [obj valueForKey:@"property"];。后者是与属性分开的称为键值编码的系统的一部分。