I'd like to test whether an object has a writeable @property in the iPhone SDK.
One possible way of doing this is to check the -valueForKey: method, but that seems rather inelegant!
Example:
@try {
id *value = [instance valueForKey:@"myProperty"];
}
@catch (NSException * e) {
// Key did not exist
}
Is there a better way of doing this?
If you are creating the object that is being checked, you could override valueForUndefinedKey:
and setValue:forUndefinedKey
to do something more useful than raising an exception.
If, on the other hand, you are trying to introspect objects you don't know about at runtime, you will have to use the runtime methods to do that. You can either use the objective-c runtime itself and call either class_copyPropertyList
or protocol_copyPropertyList
and deal with those, or use Foundation and call respondsToSelector
on the object for the KVC getter/setters for a given property, e.g., for a property foo
you would call something like [someObject respondsToSelector:NSSelectorFromString(@"foo")];
.