Foundation框架包含大量的类和方法和函数。在Max OS下,大约有125个可用的头文件。可以通过
#import <Foundation/Foundation.h>
导入,实际上Foundation.h文件导入了Foundation的所有文件。使用这条语句会增加程序编译的时间。然而,使用预编译的头文件可以避免额外的时间开销。预编译的头文件是编译器预先处理过的文件。
我们所讨论的int ,float 和 long型都是基本数据类型,他们都不是对象。也就是说不能够向他们发送消息。然而,有时候要将这些值作为对象来使用,例如,使用Foundation中的NSArray类来创建数组,它要求存储的值必须是对象,因此,不能够将任何基本数据类型存储到数组中。如果是需要存储基本数据类型,可以使用NSNumber类,它会依据这些数据类型创建对象。
不能修改前面创建的NSNumber对象的值。例如:
NSNumber *myNumber = [[NSNumber alloc] initWithInt: 50 ];
...
[myNumber initWithInt : 1000];
并不能正常运行。程序执行最后一行时,最后一条语句会引起程序崩溃。所有的数字对象都必须是新创建的,这意味着必须对NSNumber类调用创建和初始化方法,或者对alloc方法的结果调用初始化实利的方法。
方法numberWithInt:和numberWithInteger:使用有些差别,遵循一下规则:
1)如果使用numberWithInt:方法创建一个整型数,需要使用intValue获取他们的值,使用%i 作为格式化字符串显示它的值。
2)如果使用numberWithInteger:方法创建一个整型数,需要使用integerValue,也可以转化成long显示或者使用stringWithFormat:将它格式化成字符串,使用%li作为格式化字符串。
方法numberWithUnsignedInt:和numberWithUnsignedInteger:的使用类似。
#import <Foundation/Foundation.h>
int main ()
{
@autoreleasepool {
NSNumber *myNumber, *floatNumber, *intNumber;
NSInteger myInt;
//Integer型值
intNumber = [NSNumber numberWithInteger:100];
myInt = [intNumber integerValue];
NSLog(@"%li",(long) myInt);
//long型值
myNumber = [NSNumber numberWithLong:0xabcdef ];
NSLog(@"%lx",[myNumberlongValue]);
//char型值
myNumber = [NSNumber numberWithChar:119];
NSLog(@"%c",[myNumbercharValue]);
//float型值
floatNumber = [NSNumber numberWithFloat:1123.00];
NSLog(@"%f",[floatNumberfloatValue]);
//doubble型值
myNumber = [NSNumber numberWithDouble:1234e+15];
NSLog(@"%lg",[myNumberdoubleValue]);
//发生错误
NSLog(@"%li",(long) [myNumberintegerValue]);
//验证两个Number是否相等
if ([intNumber isEqualToNumber:floatNumber] ==YES) {
NSLog(@"Number are equal");
}
else
NSLog(@"Number are not equal");
//验证一个Number是否小于、等于或大于另一个Number
if ([intNumber compare: myNumber] ==NSOrderedAscending) {
NSLog(@"First number is less than second");
}
}
return 0;
}
运行结果:2014-08-21 22:34:34.122 testOC[922:303] 100
2014-08-21 22:34:34.123 testOC[922:303] abcdef
2014-08-21 22:34:34.124 testOC[922:303] w
2014-08-21 22:34:34.124 testOC[922:303] 1123.000000
2014-08-21 22:34:34.124 testOC[922:303] 1.234e+18
2014-08-21 22:34:34.125 testOC[922:303] 1234000000000000000
2014-08-21 22:34:34.125 testOC[922:303] Number are not equal
2014-08-21 22:34:34.125 testOC[922:303] First number is less than second
Program ended with exit code: 0
这里注意:NSInteger不是一个类,而是基本数据类型的typedef。它实际上是64位的long或者32位的int。NSUInteger也是类似的typedef,在程序中表示无符号整数。本段程序尝试使用下列语句获取并显示它的值:
NSLog(@"%li",(long) [myNumber integerValue]);
一般来说,你需要确保使用正确的方式获取对象的值,如果在NSNumber对象中存储了一个值,那么也需要用一般的方式去获取。
在if语句中,消息表达式
[intNumber isEqualToNumber:floatNumber]
使用了isEqualToNumber:方法比较来个两个NSNumber对象的数值。陈程序会返回一个BOOL值,查看这两个值是否相等。
还可以使用compare:方法测试一个值是否在数值上小于、等于和大于另一个值。当
[intNumber compare: myNumber]
中intNumber的值小于myNumber的值时,返回NSOrderedAscending;如果这两个数刚好相等,则返回NSOrderedSame;如果第一个值大于第二个值,则返回NSOrderedDescending。再引用Foundation.h时已经包含了NSObject.h头文件。
对于每一种基本数据类型,类方法都能创建一个NSNumber对象,并设置指定为制定值。这些方法以numberWith开头,紧接着数据类型,如:numberWithLong:、numberWithFloat:等。此外,可以使用实力方法将以前创建的NSNumber对象设置为指定的值。这些都是以initWith开头的,如:initWithLong:和initWithFloat:。
下表列出NSNumber的创建方法和检索方法
最后,可以查看一下NSDecimalNumber类的相关文档,它是NSNumber的子类,在对象层面提供类一些数字的四则运算方法。