Tob*_*ias 2 64-bit objective-c
在我们的代码中的某个时刻,我们想知道某些值的系统数据类型.所以我们在传入时进行检查,例如其中一个NSNumber:
if (strcmp([numberObject objCType], @encode(NSInteger)) == 0)
{ /* tag as integer */ }
Run Code Online (Sandbox Code Playgroud)
在64位模拟器上执行此操作,将BOOL放入NSNumber会产生奇怪的结果.
NSNumber *foo = [NSNumber numberWithBool:YES];
if(strcmp([foo objCType], @encode(BOOL)) == 0))
{ /* this should work, but it does not on 64bit */ }
Run Code Online (Sandbox Code Playgroud)
作为后备,我们可以使用类似的东西
if(strcmp([foo objCType], [[NSNumber numberWithBool:YES] objcType]) == 0))
{ /* this works, but looks like too much work for the processor */ }
Run Code Online (Sandbox Code Playgroud)
编译32位模拟器,它工作得很好.(在这两种情况下,BOOL看起来都像'char'类型,但是比较并没有给出64位的预期结果).
那么,有没有人有任何想法,为什么@encode(BOOL)在初始化时与[foo objCType]不匹配numberWithBool:?
所以我做了一点研究并执行了这个:
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]);
Run Code Online (Sandbox Code Playgroud)
并在64位模拟器中获得此结果:
encode BOOL: B
encode boolean: C
encode bool: B
encode char: c
object: c
Run Code Online (Sandbox Code Playgroud)
这在32位模拟器上
encode BOOL: c
encode boolean: C
encode bool: B
encode char: c
object: c
Run Code Online (Sandbox Code Playgroud)
所以问题是,在32位上,编码(BOOL)返回'c',但在64位上,它返回'B',而objCType在a numberWithBool:上将在64位和32位上给你'c'.
| 归档时间: |
|
| 查看次数: |
814 次 |
| 最近记录: |