到目前为止,我们所讨论过的所有数字数据类型,如int型、float型和long型都是Objective-C语言中的基本数据类型,也就是说,它们都不是对象。例如,不能向它们发送消息。然而,有时需要作为对象使用这些值。例如,使用Foundation的对象NSArray,可以设置一个用于存储值的数组。这些值必须是对象,因此不能将任何基本数据类型直接存储到这些数组中。要存储任何基本数据类型(包括char数据类型),可以使用NSNumber类根据这些数据类型来创建对象。
一般来说,无须担心需要释放Foundation方法返回的对象。有时候,对象由返回它的方法所拥有。其他情况下,对象是由方法新创建的并被添加到自动释放池中。第一部分中讲过,使用完用alloc方法显式地创建的任何对象(包括Foundation对象)之后,仍然需要释放它们。
回到上面的代码, NSNumber类包含多个方法,它们允许使用初始值创建NSNumber对象。例如,程序行:
1
|
intNumber
= [NSNumber numberWithInteger: 100]; |
从NSNumber对象获得的值必须和存储在其中的值类型一致。因此,在程序中该语句之后的printf语句中,消息表达式:
1
|
[intNumber
integerValue] |
在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]; |
1
|
NSLog
(@”%i”, [myNumber integerValue]); |
1
|
0 |
在if语句中,消息表达式
1
|
[intNumber
isEqualToNumber: floatNumber] |
可用compare:方法来测试一个数值型的值是否在数值上小于、等于或大于另一个值。消息表达式
1
|
[intNumber
compare: myNumber] |
应该注意不能重新初始化前面创建的NSNumber对象的值。例如,不能使用下面的语句设置存储在NSNumber对象myNumber中的整数:
1
|
[myNumber
initWithInt: 1000]; |
1
|
myNumber
= [[NSNumber alloc] initWithInt: 1000]; |
1
|
[myNumber
release]; |
好了,到这里,Foundation框架中的NSNumber对象就介绍完了。