Foundation框架中的NSNumber对象详解

到目前为止,我们所讨论过的所有数字数据类型,如int型、float型和long型都是Objective-C语言中的基本数据类型,也就是说,它们都不是对象。例如,不能向它们发送消息。然而,有时需要作为对象使用这些值。例如,使用Foundation的对象NSArray,可以设置一个用于存储值的数组。这些值必须是对象,因此不能将任何基本数据类型直接存储到这些数组中。要存储任何基本数据类型(包括char数据类型),可以使用NSNumber类根据这些数据类型来创建对象。


一般来说,无须担心需要释放Foundation方法返回的对象。有时候,对象由返回它的方法所拥有。其他情况下,对象是由方法新创建的并被添加到自动释放池中。第一部分中讲过,使用完用alloc方法显式地创建的任何对象(包括Foundation对象)之后,仍然需要释放它们。

回到上面的代码, NSNumber类包含多个方法,它们允许使用初始值创建NSNumber对象。例如,程序行:

1
intNumber = [NSNumber numberWithInteger: 100];
创建了一个值为100的整数对象。

从NSNumber对象获得的值必须和存储在其中的值类型一致。因此,在程序中该语句之后的printf语句中,消息表达式:

1
[intNumber integerValue]
检索存储在intNumber中的整型值,并将其存储在NSInteger变量myInt中。注意,NSInteger不是一个对象,而是基本数据类型的typedef。它被typedef成64位的long或者32位的int。存在一个类似的NSInteger typedef用于处理程序中那些未签名的整数。

在NSLog调用中,将NSInteger转换为long并使用格式字符%li,以确保值可以传递并正确显示,即使程序编译后是32位架构的。

对于每个基本值,类方法都为它分配了一个NSNumber对象,并将其设置为指定的值。这些方法以numberWith开始,之后是该方法的类型,如numberWithLong:、numberWithFloat:等。此外,可以使用实例方法为以前分配的NSNumber对象设置指定的值。这些都是以initWith开头的,如initWithLong:和initWithFloat:。

下表列出了为NSNumber对象设置值的类和实例方法,以及检索这些值的相应实例方法。

 创建和初始化类的方法  初始化实例方法  检索实例方法
 numberWithChar:  initWithChar:  charValue
 numberWithUnsignedChar:  initWithUnsignedChar:  unsignedCharValue
 numberWithShort:  initWithShort:  shortValue
 numberWithUnsignedShort:  initWithUnsignedShort:  unsignedShortValue
 numberWithInteger:  initWithInteger:  integerValue
 numberWithUnsignedInteger:  initWithUnsignedInteger:  unsignedIntegerValue
 numberWithInt:  initWithInt:  intValueunsigned
 numberWithUnsignedInt:  initWithUnsignedInt:  unsignedIntValue
 numberWithLong:  initWithLong:  longValue
 numberWithUnsignedLong:  initWithUnsignedLong:  unsignedLongValue
 numberWithLongLong:  initWithLongLong:  longlongValue
 numberWithUnsignedLongLong:  initWithUnsignedLongLong:  unsignedLongLongValue
 numberWithFloat:  initWithFloat:  floatValue
 numberWithDouble:  initWithDouble:  doubleValue
 numberWithBool:  initWithBool:  boolValue

再回到代码,该程序接下来使用类方法创建了long,char,float和double NSNumber对象。注意,使用程序行

1
myNumber = [NSNumber numberWithDouble: 12345e+15];
创建double对象后将出现什么情况?然后尝试(不正确地)使用如下程序行来检索并显示它的值:

1
NSLog (@”%i”, [myNumber integerValue]);
将得到以下输出:

1
0
并且,系统也没有给出出错消息。一般来说,你负责确保正确地进行检索,如果在NSNumber对象中存储了一个值,那么也要用一致的方式进行检索。

在if语句中,消息表达式

1
[intNumber isEqualToNumber: floatNumber]
使用isEqualToNumber:方法根据数值比较两个NSNumber对象。该程序测试返回的Boolean值,以查看这两个值是否相等。

可用compare:方法来测试一个数值型的值是否在数值上小于、等于或大于另一个值。消息表达式

1
[intNumber compare: myNumber]
在intNumber中的值小于myNumber中的值时,返回值NSOrderedAscending;如果这两个数相等,则返回值NSOrderedSame;如果第一个值大于第二个值,则返回值NSOrderedDescending。在头文件NSObject.h中已经定义了这些返回值。

应该注意不能重新初始化前面创建的NSNumber对象的值。例如,不能使用下面的语句设置存储在NSNumber对象myNumber中的整数:

1
[myNumber initWithInt: 1000];
当程序执行时,这条语句将产生一条错误。所有数字对象都必须是新创建的,这意味着必须对NSNumber类调用上表第一列列出一个方法,或者对alloc方法的结果调用第二列列出的方法中,如下所示:

1
myNumber = [[NSNumber alloc] initWithInt: 1000];
当然,基于前面的讨论,如果使用这种方式创建myNumber,则在使用完之后,你需要使用以下语句来释放它:

1
[myNumber release];

好了,到这里,Foundation框架中的NSNumber对象就介绍完了。

原文地址:https://www.cnblogs.com/Camier-myNiuer/p/3381321.html