Cocoa 键值编码:布尔属性评估为“类型”的NSNumber;我",;,不是";";
当对BOOL类型的属性(其他人提供的示例代码)使用Cocoa 键值编码:布尔属性评估为“类型”的NSNumber;我",;,不是";";,cocoa,Cocoa,当对BOOL类型的属性(其他人提供的示例代码)使用NSObject valueForKey:时,返回的NSNumber不是@encode(BOOL)=“c”——它是“i”。为什么?BOOL不是一种基本类型,它是有符号字符的typedef。因此,在运行时不可能判断属性是布尔值还是整数值。因此,我们可以确定-valueForKey:没有使用+numberWithBool:来包装该值。所以问题是,为什么不使用+numberWithChar:?可能是为了简单起见。如果所有带符号的积分值都是链接网站上的代
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
是结果,而不是cNSNumber
的类型不一定是i
。这个问题主要是教学上的,但我在测试@encode(BOOL)时发现的
vsNSNumber-objCType
无法按预期工作。我想知道使用C99 bool会有什么结果?根据《圣经》的记载,有一种特殊的类型专门用于这种形式的布尔。@Stephen:问得好NSNumber
似乎没有C99bool
的任何初始值设定项,因此我希望它使用一种积分类型,即>=sizeof(bool)
,例如int
。