int、NSInteger、NSUInteger、NSNumber的区别和联系

1、首先先了解下NSNumber类型:

NSNumber是NSValue的一个子类,它是一个对象来存储数字值包括bool型,它提供了一系列的方法来存储char a signed or unsigned char, short int, int, long int, long long int, float, or double or as a BOOL,它提供了一个compare:方法来决定两个NSNumber对象的排序;

创建一个NSNumber对象有以下方法:

 1 + (NSNumber *)numberWithChar:(char)value;
 2 + (NSNumber *)numberWithUnsignedChar:(unsigned char)value;
 3 + (NSNumber *)numberWithShort:(short)value;
 4 + (NSNumber *)numberWithUnsignedShort:(unsigned short)value;
 5 + (NSNumber *)numberWithInt:(int)value;
 6 + (NSNumber *)numberWithUnsignedInt:(unsigned int)value;
 7 + (NSNumber *)numberWithLong:(long)value;
 8 + (NSNumber *)numberWithUnsignedLong:(unsigned long)value;
 9 + (NSNumber *)numberWithLongLong:(long long)value;
10 + (NSNumber *)numberWithUnsignedLongLong:(unsigned long long)value;
11 + (NSNumber *)numberWithFloat:(float)value;
12 + (NSNumber *)numberWithDouble:(double)value;
13 + (NSNumber *)numberWithBool:(BOOL)value;
14 + (NSNumber *)numberWithInteger:(NSInteger)value NS_AVAILABLE(10_5, 2_0);
15 + (NSNumber *)numberWithUnsignedInteger:(NSUInteger)value NS_AVAILABLE(10_5, 2_0);
 初始化方法:
 1 - (id)initWithChar:(char)value;
 2 - (id)initWithUnsignedChar:(unsigned char)value;
 3 - (id)initWithShort:(short)value;
 4 - (id)initWithUnsignedShort:(unsigned short)value;
 5 - (id)initWithInt:(int)value;
 6 - (id)initWithUnsignedInt:(unsigned int)value;
 7 - (id)initWithLong:(long)value;
 8 - (id)initWithUnsignedLong:(unsigned long)value;
 9 - (id)initWithLongLong:(long long)value;
10 - (id)initWithUnsignedLongLong:(unsigned long long)value;
11 - (id)initWithFloat:(float)value;
12 - (id)initWithDouble:(double)value;
13 - (id)initWithBool:(BOOL)value;
14 - (id)initWithInteger:(NSInteger)value NS_AVAILABLE(10_5, 2_0);
15 - (id)initWithUnsignedInteger:(NSUInteger)value NS_AVAILABLE(10_5, 2_0);

NSNumber类型有点类似id类型,对于任何类型的数字对象都能用它来声明,也就是用它来声明数字对象,通过声明,很难判断声明变量是什么数字类型,确定数字对象类型多是在初始化的时候才能确定。

数字对象的创建或者初始化:

格式:

NSNumber 数字对象 = [NSNumber numberWith数字类型:数值];

1 intNumber = [NSNumber numberWithInt:100];

2 longNumber = [NSNumber numberWithLong:0xabcdef];

3 floatNumber = [NSNumber numberWithFloat:10.01]; 

2、 int、 NSInteger、 NSUInteger、NSNumber之间的区别和联系

int : 当使用int类型定义变量的时候,可以像写C程序一样,用int也可以用NSInteger,推荐使用NSInteger ,因为这样就不用考虑设备是32位还是64位了。

NSUInteger是无符号的,即没有负数,NSInteger是有符号的。

NSInteger是基础类型,NSNumber是一个类,如果需要存储一个数值,直接使用NSInteger是不行的,比如在一个数组里使用下面的语句就会报错:

1 NSArray *array = [NSArray alloc] init];
2 [array addObject:3];

因为array里应该是一个类,但‘3’不是,所以需要用NSNumber:

1 NSArray *array = [NSArray alloc] init];

2 [array addObject:[NSNumber numberWithInt:3]]; 

int和NSInteger区别

 

查到c语言中,int和long的字节数是和操作系统指针所占位数相等。

但c语言中说,long的长度永远大于或等于int

objective-c里,苹果的官方文档中总是推荐用NSInteger

它和int有什么区别呢,stackoverflow这帮大神给了答案。

原来在苹果的api实现中,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

 You usually want to use NSInteger when you don't know what kind of processor architecture your code might run on, so you may for some reason want the largest possible int type, which on 32 bit systems is just an int, while on a 64-bit system it's a long.

总结:NSInteger与int的区别是NSInteger会根据系统的位数(32or64)自动选择int的最大数值(int or long)。

 
原文地址:https://www.cnblogs.com/guchengfengyun/p/4112821.html