0

Objective-C 属性在运行时解析为什么?调用 [obj valueForKey:@"property"] 总是会产生相同的结果吗?

例如

对象属性

4

2 回答 2

2

首先,请注意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 的代理对象。

  • 如果accessInstanceVariablesDirectlyYES(默认值),则检查 ivars,命名为_<key>_is<Key><key>is<Key>。是的,这是一种访问对象私有 ivars 的方法。

  • 如果其他一切都失败了,那么它会调用valueForUndefinedKey:,它可以自由地返回一个结果(如果你想要一个通用的键/值存储,这实际上是一件非常有用的事情)。

但是十分之九,您将获得名为 的方法的值<key>

旁注:valueForKey:返回一个对象。如果返回是一个类似数字的标量(包括BOOL),它将返回一个NSNumber. 否则它将返回一个NSValue. NSPoint, NSRange,NSRectNSSize(在 Mac 上;在 iOS 上,NSRange我相信只有特别处理) 有一些特殊处理。

于 2013-10-23T00:38:38.933 回答
0

obj.property 与 [obj property] 相同,而不是 [obj valueForKey:@"property"];。后者是与属性分开的称为键值编码的系统的一部分。

于 2013-10-22T22:49:43.533 回答