views:

189

answers:

1

There's the option to go the long way, if an receiver class conforms to the NSKeyValueProtocol:

[myInstance setValue:[NSNumber numberWithInt:2] forKey:@"integerProperty"];

or the short way:

myInstance.integerProperty = 2;

what's the point of this KVC method? When is this useful?

+2  A: 

First, those aren't the same, the second should be:

myInstance.integerProperty = [NSNumber numbwerWithInt:2];

if integerProperty is an NSNumber.

IN general you use the second form when you are doing the most things. You use setVale:forKey and valueForKey: when you want to dynamically choose the property to store things in. For instance, think about how valueForKeyPath against an NSArray works (for reference, if you call -valueForKey: against an NSArray it will return an array where each object is the result of asking the corresponding object in that NSArray for that value:

- (NSArray *) valueForKey:(id)key {
  NSMutableArray *retval = [NSMutableArray array];

  for (NSObject *object in self) {
    [retval addObject:[object valueForKey:key]];
  }

  return self;
}

In the above case we were able to use valueForKey to implement our function even though we do not know what the key is beforehand, since it is passed in as an argument.

Louis Gerbarg
"First, those aren't the same, the second should be:" — not necessarily. If you've declared the property as NSInteger or similar, you use just "2" for dot syntax, but must still box it in an NSNumber for KVC.
Mike Abdullah