在很多代码规范中,建议程序员使用NSInteger而不用int,其实在大多数机器上,NSInteger和int是一样的。只有在32位系统上才有区别。
看看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
上面的条件定义大概意思是32位机器上NSInteger是int的别名,而64位机器上NSInteger是long的别名
我们再试验一下在Xcode的工程中的打印
size_t s1 = sizeof(int);
size_t s2 = sizeof(long);
size_t s3 = sizeof(float);
size_t s4 = sizeof(double);
size_t s5 = sizeof(NSInteger);
size_t s6 = sizeof(CGFloat);
size_t s7 = sizeof(NSTimeInterval);
NSLog(@"int = %d,\nlong = %d,\nfloat = %d,\ndouble = %d,\nNSInteger = %d,\nCGFloat = %d,\nNSTimeInterval = %d,",s1,s2,s3,s4,s5,s6,s7);
在iPhone 8上打印:
int = 4,
long = 8,
float = 4,
double = 8,
NSInteger = 8,
CGFloat = 8,
NSTimeInterval = 8,
在iPhone 5上打印:
int = 4,
long = 4,
float = 4,
double = 8,
NSInteger = 4,
CGFloat = 4,
NSTimeInterval = 8,
显然,iPhone 5上NSInteger占4个字节,iPhone 8上NSInteger占8个字节,所以为了尽可能利用系统性能,尽量使用NSInteger而少用int