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
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 mails | Author | Date |
|---|---|---|
| Paul Bruneau | Nov 1, 21:29 | |
| mmalc crawford | Nov 1, 22:04 | |
| Paul Bruneau | Nov 2, 13:19 | |
| Ben Trumbull | Nov 4, 00:47 |






Cocoa mail archive

