在64位迁移期间处理魔术常量

时间:2014-03-24 09:39:14

标签: objective-c cocoa-touch 32bit-64bit

我承认我做了一些愚蠢的事情,它现在咬我了。我使用定义为NSUIntegerMax的幻数常量来定义特殊情况索引。该值通常用作访问NSArray中所选项的索引。在特殊情况下,由幻数表示,我从其他地方获取值,而不是从数组中获取值。

此索引值在用户默认值中序列化为NSNumber

使用Xcode 5.1,我的iOS应用程序可以使用标准架构进行编译,现在还包括arm64。这改变了NSUIntegerMax的值,所以现在在反序列化之后我获得了32位的NSUIntegerMax值,它在与幻数的比较中不再匹配,它的值现在是64位{{1} }。它导致NSUIntegerMax原因:NSRangeException

这是我的代码中的一个小问题,因为该数组的正常范围很小,我可能只是将我的幻数重新定义为-[__NSArrayI objectAtIndex:]: index 4294967295 beyond bounds [0 .. 10]。但它感觉不对。我该如何妥善处理这个问题? 我想完全避免使用这个神奇数字会是最强大的方法吗?

注意

我认为我的幻数的问题大致相当于4294967295常数的问题。 Apple的64-bit Transition Guide for Cocoa Touch部分在Common Type-Conversion Problems in Cocoa Touch

部分中说
  
      
  • 使用框架中定义的常量NSNotFound。特别值得注意的是NSInteger常数。在64位运行时中,其值大于int类型的最大范围,因此截断其值通常会导致应用程序出错。
  •   

...但它没有说应该做什么,除非要小心; - )

1 个答案:

答案 0 :(得分:0)

如果使用NSInteger / NSUInteger,它在32位操作系统上为4b,在64位操作系统上为8b。

如果要对两个操作系统使用相同大小的整数,则应考虑使用int (4)long long (8)或int32_t / int64_t。要从int获取max int,您可以使用cast:

(int)INT_MAX
//or LONG_MAX