Cocoa 键值编码:布尔属性评估为“类型”的NSNumber;我",;,不是";";

Cocoa 键值编码:布尔属性评估为“类型”的NSNumber;我",;,不是";";,cocoa,Cocoa,当对BOOL类型的属性(其他人提供的示例代码)使用NSObject valueForKey:时,返回的NSNumber不是@encode(BOOL)=“c”——它是“i”。为什么?BOOL不是一种基本类型,它是有符号字符的typedef。因此,在运行时不可能判断属性是布尔值还是整数值。因此,我们可以确定-valueForKey:没有使用+numberWithBool:来包装该值。所以问题是,为什么不使用+numberWithChar:?可能是为了简单起见。如果所有带符号的积分值都是链接网站上的代

当对BOOL类型的属性(其他人提供的示例代码)使用
NSObject valueForKey:
时,返回的NSNumber不是
@encode(BOOL)=“c”
——它是“i”。为什么?

BOOL
不是一种基本类型,它是
有符号字符的typedef。因此,在运行时不可能判断属性是布尔值还是整数值。因此,我们可以确定
-valueForKey:
没有使用
+numberWithBool:
来包装该值。所以问题是,为什么不使用
+numberWithChar:
?可能是为了简单起见。如果所有带符号的积分值都是链接网站上的代码,我不会感到惊讶:

MyClass *c = [[MyClass alloc] init];
c.aaa = YES;

NSNumber *n = [c valueForKey:@"aaa"];

NSString *s = [NSString stringWithCString:[n objCType] encoding:NSUTF8StringEncoding];
NSLog(@"ObjC type - %@", s); // Prints 'i' instead of 'c'
在使用
[n objCType]时,您似乎在请求
n
objCType

由于
n
是一个
NSNumber
,因此
i
是结果,而不是
c

NSNumber
的类型不一定是
i
。这个问题主要是教学上的,但我在测试
@encode(BOOL)时发现的
vs
NSNumber-objCType
无法按预期工作。我想知道使用C99 bool会有什么结果?根据《圣经》的记载,有一种特殊的类型专门用于这种形式的布尔。@Stephen:问得好
NSNumber
似乎没有C99
bool
的任何初始值设定项,因此我希望它使用一种积分类型,即>=
sizeof(bool)
,例如
int