ObjC中的#typedef和KVC

tba*_*tba 7 typedef objective-c key-value-coding

我有一个看起来像这样的课程:

@interface Properties : NSObject {
@private
    NSNumber* prop1;
    NSNumberBool* prop2;
    //etc
Run Code Online (Sandbox Code Playgroud)

其中NSNumberBool是typedef:

// in MyApp_Prefix.pch
typedef NSNumber NSNumberBool;
Run Code Online (Sandbox Code Playgroud)

我有所有必需的@property和@synthesize声明来制作prop1和prop2属性.

所有编译和工作正常,直到我试图通过[myProperties valueForKey:@"prop2"]访问prop2.这给了我一个"类不符合键值"的错误.但是,许多类似的调用工作正常:

myProperties.prop2; //works
[myProperties prop2]; //works
[myProperties valueForKey:@"prop1"]; //works
[myProperties valueForKey:@"prop2"] // throws NSUnknownKeyException ??
Run Code Online (Sandbox Code Playgroud)

这里发生了什么,我该如何解决?

谢谢,

nal*_*all 5

从编译您的示例并在其上发出class-dump,看起来typedef正在变为

struct NSNumber {
    Class _field1;
};

@interface Properties : NSObject
{
    NSNumber *prop1;
    struct NSNumber *prop2;
}
Run Code Online (Sandbox Code Playgroud)

将typedef更改为this似乎工作正常,但可能不完全是你想要的.

#define NSNumberBool NSNumber
Run Code Online (Sandbox Code Playgroud)


phi*_*red 5

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

我相信typedef仍然是纯粹的C关键字,并且实际上恰好只使用Objective-C"类型",因为它们碰巧被实现为结构体.

因此,当你将NSNumber输入到NSNumberBool时它适用于方法调用(和点语法属性)但是(假设我的理论是正确的),中断编码不能告诉NSNumberBool和NSNumber是同一类型.

我有兴趣看看哪个人知道更好.


ser*_*gio 2

这是一篇相当老的帖子,但我在寻找这个问题的解决方案时看到了它,Objective-C 2.0@compatibility_alias指令很好地解决了这个问题。这允许您编写:

@compatibility_alias NSNumberBool NSNumber;
Run Code Online (Sandbox Code Playgroud)

并为 . 创建了一个别名NSNumber。KVO 与它完美配合。

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