It says "that is not key-value coding compliant for the appropriate key." What that means is that
@interface MyObject : NSObject {
NSString *foo;
NSString *bar;
}
@property (nonatomic, retain) NSString *foo;
@property (nonatomic, retain) NSString *bar;
@end
@interface MyObject
@synthesize foo;
@synthesize bar;
@end
Is compliant for "foo" and "bar", but not "baz."
For simple properties that is all there is to it, by default all NSObject subclasses implement basic KVC. It gets trickier with collections. In order for KVC to work correctly for collections (so you can do things like:
NSArray *people = ... ;
NSArray *firstNames = [people valueForKey:@"firstName"];
It requires you implement certain extra methods. In general the biggest user of that functionality is Cocoa bindings (which is not available on the iPhone) sourced out of CoreData (which generates that additional collection methods automatically anyway), so it still usually handled basically automatically. Generally people don't bother to implement full KVC support for dictionaries or arrays in their objects unless they intend to actually expose them. You can read about compliance in the KVC guide.