在我们的代码中的某个时刻,我们想知道某些值的系统数据类型。因此,我们会在传入的NSNumber
上执行其中一项检查:
if (strcmp([numberObject objCType], @encode(NSInteger)) == 0)
{ /* tag as integer */ }
在64位模拟器上执行此操作,将BOOL放入NSNumber会产生奇怪的结果。
NSNumber *foo = [NSNumber numberWithBool:YES];
if(strcmp([foo objCType], @encode(BOOL)) == 0))
{ /* this should work, but it does not on 64bit */ }
作为后备,我们可以使用类似
的内容if(strcmp([foo objCType], [[NSNumber numberWithBool:YES] objcType]) == 0))
{ /* this works, but looks like too much work for the processor */ }
编译32位模拟器,它工作得很好。 (在这两种情况下,BOOL看起来都像'char'类型,但是比较并没有给出64位的预期结果。)
那么,有没有人知道,为什么@encode(BOOL)
与[{1}}初始化时与[foo objCType]不匹配?
答案 0 :(得分:6)
所以我做了一点研究并执行了这个:
NSNumber *foo = [NSNumber numberWithBool: YES];
NSLog(@"encode BOOL: %s", @encode(BOOL));
NSLog(@"encode boolean: %s", @encode(Boolean));
NSLog(@"encode bool: %s", @encode(bool));
NSLog(@"encode char: %s", @encode(char));
NSLog(@"object: %s", [foo objCType]);
并在64位模拟器中得到了这个结果:
encode BOOL: B
encode boolean: C
encode bool: B
encode char: c
object: c
这是在32位模拟器上
encode BOOL: c
encode boolean: C
encode bool: B
encode char: c
object: c
所以问题是,在32位上,编码(BOOL)返回一个' c'但是在64位上,它返回一个' B',而objCType
在numberWithBool:
上会给你一个' c'在64位和32位上。