tba tba - 4 months ago 25
Objective-C Question

#typedef and KVC in ObjC

I have a class that looks like this:

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


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?

Thanks,

Answer

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