最近项目里有一个功能被曝说在iphone5上失效,追查后的原因是一个id值在iphone5存储到NSNumber时数据溢出导致的。开始时rd告诉我说是由于iphone5上的cpu架构是32位的,而从iphone5s开始cpu架构是64位的,代码里用的int也是不同size导致。
虽然我没写过oc的代码,但是我知道在c++里int的size是固定的4bytes,而long才是可变的。最终跟了一下代码,原来代码里用了NSInteger这个包裹类,而其定义为:
#if __LP64__ || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif
从定义可以看到,其定义是跟CPU总线位数相关的,而long得size是32位系统下为4bytes,64位系统下为8bytes。
从官方doc可以见到。
Table 1-1 Size and alignment of integer data types in OS X and iOS
Integer data type | ILP32 size | ILP32 alignment | LP64 size | LP64 alignment |
---|---|---|---|---|
char | 1 byte | 1 byte | 1 byte | 1 byte |
BOOL, bool | 1 byte | 1 byte | 1 byte | 1 byte |
short | 2 bytes | 2 bytes | 2 bytes | 2 bytes |
int | 4 bytes | 4 bytes | 4 bytes | 4 bytes |
long | 4 bytes | 4 bytes | 8 bytes | 8 bytes |
long long | 8 bytes | 4 bytes | 8 bytes | 8 bytes |
网友评论