The way Cocoa derives the name of an accessor from the name of an instance variable is through a mechanism called key–value coding, or simply KVC. (See also Chapter 5, where I introduced key–value coding.) A key is a string (an NSString) that names the value to be accessed. The basis for key–value coding is the NSKeyValueCoding protocol, an informal protocol (it is actually a category) to which NSObject (and therefore every object) conforms.
The fundamental key–value coding methods are
setValue:forKey:. When one of these methods is called on an object, the object is introspected. In simplified terms, first the appropriate accessor is sought; if it doesn’t exist, the instance variable is accessed directly. So, for example, suppose the call is this:
[myObject setValue:@"Hello" forKey:@"greeting"];
First, a method
setGreeting: is sought in
myObject; if it exists, it is called, passing
@"Hello" as its argument. If that fails, but if
myObject has an instance variable called
greeting, the value
@"Hello" is assigned directly to
The key–value coding mechanism can bypass completely the privacy of an instance variable! Cocoa knows that you might not want to allow that, so a class method
accessInstanceVariablesDirectly is supplied, which you can override to return NO (the default is YES).
setValue:forKey: require an object as the value. Your accessor’s signature (or, if there is no accessor, the instance variable ...