Objective c #ObjC中的类型定义和KVC

Objective c #ObjC中的类型定义和KVC,objective-c,typedef,key-value-coding,Objective C,Typedef,Key Value Coding,我有一个类似这样的类: @interface Properties : NSObject { @private NSNumber* prop1; NSNumberBool* prop2; //etc 其中NSNumberBool是一个类型定义: // in MyApp_Prefix.pch typedef NSNumber NSNumberBool; 我有所有必需的@property和@synthesis声明来生成prop1和prop2属性 在我尝试通过[myProp

我有一个类似这样的类:

@interface Properties : NSObject {
@private
    NSNumber* prop1;
    NSNumberBool* prop2;
    //etc
其中NSNumberBool是一个类型定义:

// in MyApp_Prefix.pch
typedef NSNumber NSNumberBool;
我有所有必需的@property和@synthesis声明来生成prop1和prop2属性

在我尝试通过[myProperties valueForKey:@“prop2]”访问prop2之前,一切都已编译并运行良好。这给了我一个“类不符合键值”错误。但是,许多类似的调用都可以正常工作:

myProperties.prop2; //works
[myProperties prop2]; //works
[myProperties valueForKey:@"prop1"]; //works
[myProperties valueForKey:@"prop2"] // throws NSUnknownKeyException ??
这里发生了什么,我该怎么解决


谢谢,

编译您的示例并发布之后,typedef似乎变成了

struct NSNumber {
    Class _field1;
};

@interface Properties : NSObject
{
    NSNumber *prop1;
    struct NSNumber *prop2;
}
将typedef更改为这个似乎可以很好地工作,但可能不是您想要的

#define NSNumberBool NSNumber

我怀疑这是typedef与encode方法交互方式的问题

我相信typedef仍然是一个纯粹的C关键字,而且实际上只有在使用Objective-C“类型”时才会使用,因为它们碰巧是作为结构实现的

因此,当您将def NSNumber键入NSNumberBool时,它对于方法调用(和点语法属性)工作正常,但是(假设我的理论是正确的),会中断encode,这无法判断NSNumberBool和NSNumber是同一类型


我很想看看更了解情况的人会怎么说。

与nall的答案类似,我也尝试了类转储。我确实找到了一个有趣的,但很难看的解决方法。以下代码:

typedef NSNumber* NSNumberBoolPtr;

@interface Test : NSObject {
    NSNumber *real;
    NSNumberBoolPtr poser;
}
类转储到:

@interface Test : NSObject
{
    NSNumber *real;
    NSNumber *poser;
}

@end

同样,这不是你想要的,但你会得到编译器时间检查,没有NSNUMBERBOOL和NSNUMBERBOOL混合(这是我首先假设的typedef的原因)。

这是一篇相当古老的文章,但我是在寻找解决这个问题的方法时发现它的,Objective-C2.0指令很好地解决了这个问题。这允许您编写:

@compatibility_alias NSNumberBool NSNumber;
并为
NSNumber
创建别名。KVO与之完美配合


与目前被接受的答案相比,这有很大的好处,即类型安全。

真奇怪,我自己也遇到了同样的问题。另外,如果执行
[myProperties respondsToSelector:@selector(prop2)]
操作,它也会返回YES