【iOS知识学习】_int、NSInteger、NSUInteger、NSNumber的区别和联系

本文详细介绍了NSNumber类型,包括其创建方法及如何存储不同类型的数值。同时对比了int、NSInteger、NSUInteger和NSNumber的区别,帮助开发者更好地理解并选择合适的数值类型。

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

苹果官方文档地址:https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSNumber_Class/Reference/Reference.html

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对象有以下方法:

+ numberWithBool:
+ numberWithChar:
+ numberWithDouble:
+ numberWithFloat:
+ numberWithInt:
+ numberWithInteger:
+ numberWithLong:
+ numberWithLongLong:
+ numberWithShort:
+ numberWithUnsignedChar:
+ numberWithUnsignedInt:
+ numberWithUnsignedInteger:
+ numberWithUnsignedLong:
+ numberWithUnsignedLongLong:
+ numberWithUnsignedShort:

初始化方法:

– initWithBool:
– initWithChar:
– initWithDouble:
– initWithFloat:
– initWithInt:
– initWithInteger:
– initWithLong:
– initWithLongLong:
– initWithShort:
– initWithUnsignedChar:
– initWithUnsignedInt:
– initWithUnsignedInteger:
– initWithUnsignedLong:
– initWithUnsignedLongLong:
– initWithUnsignedShort:
检索

– boolValue
– charValue
– decimalValue
– doubleValue
– floatValue
– intValue
– integerValue
– longLongValue
– longValue
– shortValue
– unsignedCharValue
– unsignedIntegerValue
– unsignedIntValue
– unsignedLongLongValue
– unsignedLongValue
– unsignedShortValue
NSNumber类型有点类似id类型,对于任何类型的数字对象都能用它来声明,也就是用它来声明数字对象,通过声明,很难判断声明变量是什么数字类型,确定数字对象类型多是在初始化的时候才能确定。

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

格式:

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

intNumber = [NSNumber numberWithInt:100];
longNumber = [NSNumber numberWithLong:0xabcdef];
floatNumber = [NSNumber numberWithFloat:10.01];

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

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

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

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

NSArray *array = [NSArray alloc] init];
[array addObject:3];
因为array里应该是一个类,但‘3’不是,所以需要用NSNumber:

NSArray *array = [NSArray alloc] init];
[array addObject:[NSNumber numberWithInt:3]];

写的比较简单,希望有帮助。








<think> 我们在Objective-C中讨论枚举类型。在Objective-C中,枚举类型实际上是基于整数类型(通常是int)的。当给一个枚举变量赋一个不在其枚举列表中的值时,编译器通常不会报错,因为枚举本质上就是整数。 具体来说,如果定义了一个枚举,比如: typedef enum { OnBoardingDeviceModelSeriesA = 0, OnBoardingDeviceModelSeriesB, OnBoardingDeviceModelSeriesC } OnBoardingDeviceModelSeries; 这个枚举类型OnBoardingDeviceModelSeries的取值范围是0,1,2(假设没有手动指定后面的值,默认递增)。 如果我们给这个枚举类型的变量赋一个超出范围的值,比如3,那么: OnBoardingDeviceModelSeries series = 3; 这个赋值操作是合法的,因为枚举变量实际上就是一个整数。编译器可能会给出警告(取决于编译选项),但不会阻止编译。 在运行时,这个枚举变量就会持有值3,即使它没有对应的枚举成员。当我们使用这个变量时,比如在switch语句中,如果没有处理3的情况,那么可能会执行default分支(如果有的话),或者如果没有default分支,则switch语句不会执行任何分支。 因此,超出枚举定义范围的值是被允许的,但程序逻辑可能无法正确处理它,从而导致未定义行为或逻辑错误。 为了避免这种情况,我们在使用枚举变量时,应该注意: 1. 赋值时确保值在枚举定义的范围内。 2. 在处理枚举变量时(如switch语句),使用default分支来处理未知的值,以保证程序的健壮性。 另外,在Objective-C中,我们也可以使用NS_ENUM宏来定义枚举,这并不会改变上述行为,但可以提供更好的类型检查与C++的兼容性。 示例代码: ```objectivec typedef NS_ENUM(NSInteger, OnBoardingDeviceModelSeries) { OnBoardingDeviceModelSeriesA = 0, OnBoardingDeviceModelSeriesB, OnBoardingDeviceModelSeriesC }; // 赋值超出范围 OnBoardingDeviceModelSeries series = (OnBoardingDeviceModelSeries)3; // 使用强制类型转换避免编译器警告,但通常不需要,因为整数可以直接赋给枚举变量(可能会有警告) // 或者直接赋值 // OnBoardingDeviceModelSeries series = 3; // 编译器可能会产生警告 // 使用switch处理 switch (series) { case OnBoardingDeviceModelSeriesA: // 处理A break; case OnBoardingDeviceModelSeriesB: // 处理B break; case OnBoardingDeviceModelSeriesC: // 处理C break; default: // 处理未知系列 break; } ``` 注意:直接赋值超出范围的值,编译器可能会产生警告(取决于警告级别),因为将整数赋给枚举类型可能是不安全的。如果确实需要这样做(比如从网络接收的整数值),建议进行范围检查或者使用强制类型转换(但强制类型转换只是消除警告,并不改变行为)。 总结:Objective-C枚举可以持有超出定义范围的值,这不会导致运行时错误(如崩溃),但可能导致逻辑错误。因此,在编程中应当谨慎处理。 </think>在 Objective-C 中,当枚举 `OnBoardingDeviceModelSeries` 的数字超出定义范围时,**不会引发运行时错误或异常**,但会导致未定义行为。具体表现如下: 1. **变量存储** 枚举本质上是整数类型(通常是 `int` 或 `NSInteger`),编译器会直接存储超出范围的值: ```objectivec typedef NS_ENUM(NSInteger, OnBoardingDeviceModelSeries) { SeriesA = 0, SeriesB = 1, SeriesC = 2 }; OnBoardingDeviceModelSeries invalidSeries = 5; // 编译器允许赋值 ``` 2. **逻辑风险** - **switch 语句未覆盖**:若 `switch` 缺少 `default` 分支,代码会跳过处理: ```objectivec switch (invalidSeries) { case SeriesA: /* A 处理 */ break; case SeriesB: /* B 处理 */ break; // 无 default 分支 → 跳过执行 } ``` - **数据传递错误**:将无效值传递给方法可能导致意外行为: ```objectivec [self setupDeviceForSeries:invalidSeries]; // 方法内可能无法处理 ``` 3. **调试建议** 通过断言或异常提前暴露问题: ```objectivec NSAssert(series >= SeriesA && series <= SeriesC, @"无效枚举值: %ld", (long)series); // 或 if (series < SeriesA || series > SeriesC) { @throw [NSException exceptionWithName:@"InvalidEnum" reason:@"枚举值越界" userInfo:nil]; } ``` --- **
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值