我承认我做了一些愚蠢的事情,它现在咬我了。我使用定义为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类型的最大范围,因此截断其值通常会导致应用程序出错。
...但它没有说应该做什么,除非要小心; - )
答案 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