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)
这里发生了什么,我该如何解决?
谢谢,
从编译您的示例并在其上发出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)
我怀疑这是typedef与encode方法交互的方式的问题.
我相信typedef仍然是纯粹的C关键字,并且实际上恰好只使用Objective-C"类型",因为它们碰巧被实现为结构体.
因此,当你将NSNumber输入到NSNumberBool时它适用于方法调用(和点语法属性)但是(假设我的理论是正确的),中断编码不能告诉NSNumberBool和NSNumber是同一类型.
我有兴趣看看哪个人知道更好.
这是一篇相当老的帖子,但我在寻找这个问题的解决方案时看到了它,Objective-C 2.0@compatibility_alias
指令很好地解决了这个问题。这允许您编写:
@compatibility_alias NSNumberBool NSNumber;
Run Code Online (Sandbox Code Playgroud)
并为 . 创建了一个别名NSNumber
。KVO 与它完美配合。
与目前接受的答案相比,这具有类型安全的巨大好处。