Objective-C属性在运行时被解析为什么?

时间:2013-10-22 22:44:30

标签: objective-c objective-c-runtime

Objective-C属性在运行时被解析了什么?调用[obj valueForKey:@“property”]会不会产生相同的结果?

e.g。

obj.property

2 个答案:

答案 0 :(得分:2)

首先,请注意obj.property[obj property]完全相同。点语法只是语法糖。虽然有一些与其他方法不同的属性相关的小型运行时实现细节,但为了本讨论的目的,只考虑“我有一个名为_key的ivar和一个名为{{1的方法”。 }}“。您通过声明属性创建了ivar和方法的事实与-key无关。

valueForKey:是一种方法,它可以被类重写以返回它喜欢的任何内容。 默认行为是valueForKey:首先查找名称与键匹配的方法,并返回结果。在绝大多数情况下,这意味着如果您有一个属性,那么valueForKey:将返回它的值。

valueForKey:@"property"中解释了默认实施valueForKey:的完整搜索路径,但这里是“简短”版本:

  • get<Key><key>is<Key>(是的,它看起来的第一个地方是getKey,这有点令人尴尬,因为你不应该为吸气者添加前缀get除非他们通过引用返回值,但是你去了;这是第一件检查。)

  • countOf<Key>objectIn<Key>AtIndex:<key>AtIndexes。如果找到这些的合法组合,则返回类似NSArray的代理对象。

  • countOf<Key>enumeratorOf<Key>memberOf<Key>:。如果找到所有三个,则返回类似NSSet的代理对象。

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

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

但是十分之九,你将获得名为valueForUndefinedKey:的方法的价值。

旁注:<key>返回一个对象。如果返回值是类似数字的标量(包括valueForKey:),则返回BOOL。否则它将返回NSNumber。对NSValueNSPointNSRangeNSRect进行了一些特殊处理(在Mac上;在iOS上,我认为只有NSSize处理)。

答案 1 :(得分:0)

obj.property与[obj property]相同,而不是[obj valueForKey:@“property”];。后者是名为Key Value Coding的系统的一部分,该系统与属性分开。