Skip navigation.
 
mlre: When to use key-value coding to get values vs. accessors
FROM : Ben Trumbull
DATE : Sun Nov 04 00:47:45 2007

> Hi-
>
> Not looking for an in-depth explanation (I should be able to find/
> understand the docs once I get tipped in the right direction), but
> can someone briefly hint to me the reason Apple uses key-value coding
> in this example code:
>
> - (NSString *)fullNameAndID
> {
>    return [NSString stringWithFormat:@"%@, %@ (%@)",
>            [self valueForKey:@"lastName"],
>            [self valueForKey:@"firstName"],
>            [self valueForKey:@"employeeID"]];
> }
>
>
> the example comes from
> http://developer.apple.com/documentation/Cocoa/Conceptual/
> NSPersistentDocumentTutorial/03_CustomClass/chapter_4_section_3.html
>
> Is there any advantage over doing it how I would tend to think to do
> it?:
>
> - (NSString *)fullNameAndID
> {
>    return [NSString stringWithFormat:@"%@, %@ (%@)",
>            [self lastName],
>            [self firstName],
>            [self employeeID]];
> }


KVC and accessor methods solve different problems.  KVC is providing a 
general purpose data access API by name.  It's more interesting when 
those strings are not constant strings.

Usually, KVC actually works via the accessor methods.

In this example, it's probably the case that this is Tiger based Core 
Data example code, and the author did not want to declare a custom 
subclass that implemented those accessor methods.  Or to most clearly 
answer your question, the author of this code felt like it for 
convenience.

On Leopard, you can write the same code with the accessor method 
style, and Core Data will dynamically generate the accessors if you 
didn't implement them in a subclass.  Or rephrased, you can always 
invoke an accessor for a modeled property on an NSManagedObject, even 
if it's class is declared as 'NSManagedObject'

> It must be because using -valueForKey: triggers something somewhere
> but I don't quite have a handle on what. Is it better Cocoa practice
> to just always use valueForKey? Or do I have to keep track in my head
> on an object by object (or even accessor by accessor) basis when it
> should be used?


Uhm, the compiler will do that for you.  I prefer the accessor 
methods.  They are faster, and type/spell checked.  But KVC works with 
generic model objects like NSMutableDictionary and the super class 
NSManagedObject regardless of whether accessor methods even exist. 
Some people prefer KVC and a more generic/dynamic coding style.

You really only *have* to use KVC if you find yourself trying to take 
a string and look up the method name and invoke it.  KVC is a lot 
easier for that than groping through runtime functions.

- Ben

Related mailsAuthorDate
mlWhen to use key-value coding to get values vs. accessors Paul Bruneau Nov 1, 21:29
mlRe: When to use key-value coding to get values vs. accessors mmalc crawford Nov 1, 22:04
mlRe: When to use key-value coding to get values vs. accessors Paul Bruneau Nov 2, 13:19
mlre: When to use key-value coding to get values vs. accessors Ben Trumbull Nov 4, 00:47