tba tba - 1 year ago 102
Objective-C Question

#typedef and KVC in ObjC

I have a class that looks like this:

@interface Properties : NSObject {
NSNumber* prop1;
NSNumberBool* prop2;

where NSNumberBool is a typedef:

// in MyApp_Prefix.pch
typedef NSNumber NSNumberBool;

I have all the required @property and @synthesize declarations to make prop1 and prop2 properties.

Everything compiled and worked fine until I tried to access prop2 by [myProperties valueForKey:@"prop2"]. This gives me a "class is not key-value compliant" error. However, many similar calls work fine:

myProperties.prop2; //works
[myProperties prop2]; //works
[myProperties valueForKey:@"prop1"]; //works
[myProperties valueForKey:@"prop2"] // throws NSUnknownKeyException ??

What is going on here, and how can I fix it?


Answer Source

From compiling your example and issuing class-dump on it, it appears the typedef is getting turned into

struct NSNumber {
    Class _field1;

@interface Properties : NSObject
    NSNumber *prop1;
    struct NSNumber *prop2;

Changing the typedef to this seems to work fine, though maybe not exactly what you want.

#define NSNumberBool NSNumber