[Accessor Search Implementation Details]
Key-value coding attempts to use accessor methods to get and set values, before resorting to directly accessing the instance variable.
Key-value coding 优先使用accessor methods走获取与设置数据,之后再使直接访问instance variable.
[Accessor Search Patterns for Simple Attributes]
When the default implementation of setValue:forKey:
is
invoked for a property the following search pattern is used:
The receiver’s class is searched for an accessor method whose name matches
the pattern set<Key>:
.
If no accessor is found, and the receiver’s class
method accessInstanceVariablesDirectly
returns YES
,
the receiver is searched for an instance variable whose name matches the
pattern _<key>
, _is<Key>
, <key>
,
or is<Key>
, in that order.
If a matching accessor or instance variable is located, it is used to set the value.
If no appropriate accessor or instance variable is found, setValue:forUndefinedKey:
is
invoked for the receiver.
When the default implementation of valueForKey:
is
invoked on a receiver, the following search pattern is used:
Searches the class of the receiver for an accessor method whose name
matches the pattern get<Key>
, <key>
,
or is<Key>
, in that order. If such a
method is found it is invoked.
Otherwise (no simple accessor method is found), searches the class of the
receiver for methods whose names match the patterns countOf<Key>
and objectIn<Key>AtIndex:
(corresponding
to the primitive methods defined by the NSArray
class)
and <key>AtIndexes:
(corresponding
to the NSArray
method objectsAtIndexes:
).
If the countOf<Key>
method and at least one of
the other two possible methods are found, a collection proxy
object that responds to
all NSArray
methods is returned.
Each NSArray
message sent to the collection proxy
object will result in some combination
of countOf<Key>
, objectIn<Key>AtIndex:
,
and<key>AtIndexes:
messages being sent to the original
receiver of valueForKey:
. If the class of the receiver
also implements an optional method whose name matches the
pattern get<Key>:range:
that method will be used
when appropriate for best performance.
Otherwise (no simple accessor method or set of array access methods is
found), searches the class of the receiver for a threesome of methods whose
names match the patterns countOf<Key>
, enumeratorOf<Key>
,
and memberOf<Key>:
(corresponding
to the primitive methods defined by the NSSet
class).
If all three methods are found, a collection proxy object that responds to
all NSSet
methods is returned.
Each NSSet
message sent to the collection proxy object
will result in some combination
of countOf<Key>
, enumeratorOf<Key>
,
and memberOf<Key>:
messages being sent to the
original receiver ofvalueForKey:
.
Otherwise (no simple accessor method or set of collection access methods is
found), if the receiver‘s class method accessInstanceVariablesDirectly
returns YES
,
the class of the receiver is searched for an instance variable whose name
matches the
pattern _<key>
, _is<Key>
, <key>
,
or is<Key>
, in that order. If such an instance
variable is found, the value of the instance variable in the receiver is
returned. If the type of the result is one of the scalar types supported
by NSNumber
conversion is done and
an NSNumber
is returned. Otherwise, conversion is done
and an NSValue
is returned. Results of arbitrary types
are converted to NSValue
objects, not
just NSPoint
, NSRange
, NSRect
,
and NSSize
types.
If none of the above situations occurs, returns a result the default
implementation invokes valueForUndefinedKey:
.
Accessor Search Implementation Details,布布扣,bubuko.com
Accessor Search Implementation Details
原文:http://www.cnblogs.com/tekkaman/p/3587034.html