Objective-C属性在运行时被解析了什么?调用[obj valueForKey:@“property”]会不会产生相同的结果?
e.g。
obj.property
答案 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的代理对象。
如果accessInstanceVariablesDirectly
为YES
(默认值),则会检查ivars,名为_<key>
,_is<Key>
,<key>
或{{ 1}}。是的,这是一种访问对象私有ivars的方法。
如果其他一切都失败了,那么它会调用is<Key>
,它可以自由返回一个结果(如果你想要一个通用的键/值存储,这实际上是一件非常有用的事情)。
但是十分之九,你将获得名为valueForUndefinedKey:
的方法的价值。
旁注:<key>
返回一个对象。如果返回值是类似数字的标量(包括valueForKey:
),则返回BOOL
。否则它将返回NSNumber
。对NSValue
,NSPoint
,NSRange
和NSRect
进行了一些特殊处理(在Mac上;在iOS上,我认为只有NSSize
处理)。
答案 1 :(得分:0)
obj.property与[obj property]相同,而不是[obj valueForKey:@“property”];。后者是名为Key Value Coding的系统的一部分,该系统与属性分开。