Objective-C:键入将对象强制转换为integer_t的类型



integer_t是此处定义的int32_t的typedef,经过一些检查,integer_t的大小为4个字节,int(intValue(的大小也是如此。我的问题是,像这样的选角会产生有效的结果吗?

integer_t value = 100;
id anObject = @(value);
integer_t aValue = [anObject intValue];

aValue总是等于value吗?从长远来看,这会引起什么问题吗?我应该改为long value = [anObject longValue]吗?提前谢谢。

简短而具体的答案-是,这些值是相等的,因为integer_tint都(根据您的说法-这里是陷阱(具有相同的大小和相同的有符号性。如果一个是例如某种类型的无符号int,那么它将不起作用。如果一个是8字节(长(,另一个是4字节(整数(,那么它也不起作用。

长期而普遍的答案是——这取决于情况。是的,在这里你认为这是平等的,但总有一些有趣的情况你需要注意。我已经提到了规模和签名,但真正的旅程可能是在系统架构上。所以你可能会假设它们是一样的,然后有一天你为64b的arch编译,所有的都分解为int,有8个字节的长度,integer_t仍然是4。例如,你也可能遇到endianness问题。因此,如果您从大型机获得一堆int,它们可以存储在BADC中,其中a、B、C和D是int的4个字节

正如你所看到的,使用这些东西很容易吓到任何人,这就是为什么在实践中会有NSInteger-Objective-C试图保护你免受这些攻击的原因。但不要害怕,这些都是没有牙齿的怪物,除非你的工作水平很低,然后你的工作就是和它们一起工作。这听起来不是很诗意吗。

回到代码——不要太担心这些。如果您在Objective-C中工作,现在可以尝试使用NSIntegerNSUInteger类型。如果你存储了这些,以后需要再次加载,那么你需要考虑从32b拱门存储并在64b拱门上恢复的可能性,然后以某种方式解决这个问题。

最新更新