前一篇说到了Foundation框架中的NSDirctionary类,这一一篇来看一下Foundation的其他常用的类:NSNumber,NSDate,NSException。

注:其实按照Java中集合的思想,应该还有一个Set,是的,OC中有NSSet和NSMutableSet这两个类的,但是,这里我为什么不单独介绍了呢?因为他的操作和NSArray是非常相似的,只是他和NSArray有一个区别就是他不能放重复数据,而且他也是无序的。其他没什么了,所以就不单独介绍了,而且NSSet在后面的开发过程中用到的可能不是很多。

 

1、NSNumber

这个类主要是用来封装基本类型的,说到这里,就不得不说一下了:

OC中的集合是不允许存入基本类型的,所以NSNumber类就诞生了,需要将基本类型封装一下,然后存进去,这个类似于Java中的自动装箱和拆箱,Java中的集合其实也是不允许存入基本类型的,但是我们任然看可以那么操作,就是因为有自动装箱功能,如果你将Eclipse的JDK改成5.0之前的,你看看还能操作吗。。

注:那为什么基本类型不能存入到集合中呢?

原因是在操作集合的时候会操作集合元素中的方法,但是基本类型是没有方法的。

从这一点上我们就可以看出NSNumber是很重要的,后面一定会经常用到。

 1 //  
 2 //  main.m  
 3 //  21_NSNumber  
 4 //  
 5 //  Created by jiangwei on 14-10-12.  
 6 //  Copyright (c) 2014年 jiangwei. All rights reserved.  
 7 //  
 8   
 9 #import <Foundation/Foundation.h>  
10   
11 //包装基本数据类型  
12 int main(int argc, const charchar * argv[]) {  
13     @autoreleasepool {  
14         //1.----------------创建NSNumber  
15         //封包  
16         NSNumber *intNumber = [NSNumber numberWithInt:3];  
17         NSNumber *floatNumber = [NSNumber numberWithFloat:9.8f];  
18         NSArray *array = @[intNumber,floatNumber];  
19           
20         //解包  
21         int value = [intNumber intValue];  
22         float values = [floatNumber floatValue];  
23         NSString *str = [intNumber stringValue];  
24           
25         //优化语法  
26         NSNumber *intNumbers = @12;  
27           
28           
29         //如何将结构体存入到数组中  
30         //使用NSValue对结构体进行封装  
31         //NSValue是NSNumber的父类  
32         //封包  
33         NSRange rang = {1,3};  
34         NSValue *v = [NSValue valueWithRange:rang];  
35           
36         //解包  
37         rang = [v rangeValue];  
38           
39           
40         //对自定义的结构体进行封包  
41         struct WXPoint{  
42             float x;  
43             float y;  
44         };  
45           
46         struct WXPoint p = {50,100};  
47         //第一个参数是结构体的变量地址,第二个参数是类型  
48         NSValue *v1 = [NSValue value:&p withObjCType:@encode(struct WXPoint)];  
49           
50         //解包  
51         struct WXPoint p1;  
52         [v1 getValue:&p1];  
53           
54           
55         //NSNULL的使用  
56         //数组中是没有办法存放一个空对象的nil  
57         //NSArray *nilArray = @[nil,nil,nil];//报错的  
58         //有时候我们需要在数组中存入一个空对象的需求  
59         NSNull *n1 = [NSNull null];  
60         NSNull *n2 = [NSNull null];  
61         NSArray *nullArray = @[n1,n2];  
62         NSLog(@"nullArray =%@",nullArray);  
63           
64           
65     }  
66     return 0;  
67 } 

1、封包和解包

 1 //1.----------------创建NSNumber  
 2 //封包  
 3 NSNumber *intNumber = [NSNumber numberWithInt:3];  
 4 NSNumber *floatNumber = [NSNumber numberWithFloat:9.8f];  
 5 NSArray *array = @[intNumber,floatNumber];  
 6   
 7 //解包  
 8 int value = [intNumber intValue];  
 9 float values = [floatNumber floatValue];  
10 NSString *str = [intNumber stringValue];  

NSNumber类中有基本类型对应的方法,可以这么操作的,不过值得一提的是:

1 NSString *str = [intNumber stringValue];  
2 NSLog(@"%@",str);  

我们看到,intNumber是用包装int类型的,但是我们可以使用stringValue方法进行解包,这个就相当于int类型转化成NSString类型了,这个需要注意了,同样反过来也是可以的。

运行结果:

 

2、优化创建方式

1 //优化语法  
2 NSNumber *intNumbers = @12;  

貌似和创建字符串方式很类似。

3、结构体类型的自动封包和解包

1 //如何将结构体存入到数组中  
2 //使用NSValue对结构体进行封装  
3 //NSValue是NSNumber的父类  
4 //封包  
5 NSRange rang = {1,3};  
6 NSValue *v = [NSValue valueWithRange:rang];  
7   
8 //解包  
9 rang = [v rangeValue];  

在OC中还有一个结构体类型,他也是不能直接存入到集合类中的,对他进行封装的时NSValue类,不是NSNumber类了。

4、对自定义结构体类型进行自动封包和解包

 1 //对自定义的结构体进行封包  
 2 struct WXPoint{  
 3     float x;  
 4     float y;  
 5 };  
 6   
 7 struct WXPoint p = {50,100};  
 8 //第一个参数是结构体的变量地址,第二个参数是类型  
 9 NSValue *v1 = [NSValue value:&p withObjCType:@encode(struct WXPoint)];  
10   
11 //解包  
12 struct WXPoint p1;  
13 [v1 getValue:&p1];
 

对于自定义的结构体类型,我们在封包的时候需要使用value:withObjCType:方法来进行操作了,需要使用@encode(struct WXPoint)传递进去,这个作用就是相当于把结构体类型传递过去。

记住:在对自定义结构体类型进行封包的时候需要传递结构体类型

5、对空值进行封装

1 //NSNULL的使用  
2 //数组中是没有办法存放一个空对象的nil  
3 //NSArray *nilArray = @[nil,nil,nil];//报错的  
4 //有时候我们需要在数组中存入一个空对象的需求  
5 NSNull *n1 = [NSNull null];  
6 NSNull *n2 = [NSNull null];  
7 NSArray *nullArray = @[n1,n2];  
8 NSLog(@"nullArray =%@",nullArray);  

首先我们要了解一下,为什么会有这么需求:需要将空值存入到集合中,我们后面会说到具体的应用。那么这里需要使用NSNull来进行封包和解包。

二、NSDate

这个类是OC中操作日期的类,他的用处也是很多的,后面会说到定时器,就会用到这个类

 1 //  
 2 //  main.m  
 3 //  22_NSDate  
 4 //  
 5 //  Created by jiangwei on 14-10-12.  
 6 //  Copyright (c) 2014年 jiangwei. All rights reserved.  
 7 //  
 8   
 9 #import <Foundation/Foundation.h>  
10   
11 int main(int argc, const charchar * argv[]) {  
12     @autoreleasepool {  
13         //1.----------------创建日期  
14         NSDate *date = [NSDate date];//代表当前的时间点  
15         NSDate *date1 = [[NSDate alloc] init];  
16         NSLog(@"%@",date);  
17           
18         date1 = [NSDate dateWithTimeIntervalSinceNow:1000];//单位是秒,在当前时间加上1000s,如果是减去一个时间,直接使用负值就可以了  
19         NSLog(@"%@",date);  
20           
21         //时间戳:某个日期到1970年之间的一个差值,这个值是很大的  
22         NSDate *date2 = [NSDate dateWithTimeIntervalSince1970:1000];//参数为时间戳的大小  
23           
24         //创建一个日期,然后拿到时间戳  
25         NSDate *now = [NSDate date];  
26         NSTimeInterval interval = [now timeIntervalSince1970];  
27         interval = [now timeIntervalSinceNow];//到当前时间的一个差值  
28           
29         //日期的比较  
30         //通过调用日期对象的compare,或者通过两个日期之间的差值判断  
31         NSComparisonResult result = [date compare:date1];  
32         if(result == NSOrderedAscending){  
33             //大于  
34         }else if(result == NSOrderedDescending){  
35             //小于  
36         }else{  
37             //等于  
38         }  
39           
40           
41         //日期格式化  
42         NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];  
43         [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];  
44         NSString *str = [dateFormatter stringFromDate:date];  
45         NSLog(@"%@",str);  
46           
47           
48         //设置时区  
49         NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"America/New_York"];  
50         [dateFormatter setTimeZone:timeZone];  
51           
52         //下面的方法是从格林时区开始添加和减去一个时区值(格林时区为0)  
53         //[NSTimeZone timeZoneForSecondsFromGMT:0];  
54           
55         //通过打印可以得到具体的时区  
56         NSArray *array = [NSTimeZone knownTimeZoneNames];//获取所有的时区  
57         for(NSString *str in array){  
58             NSLog(@"%@",str);  
59         }  
60           
61           
62         //将字符串转化成日期对象  
63         NSString *strs = @"2013年12月14日 16:31:08";  
64         [dateFormatter setDateFormat:@"yyyy年MM月dd日 HH:mm:ss"];  
65         date1 = [dateFormatter dateFromString:strs];  
66           
67           
68     }  
69     return 0;  
70 } 

1、创建一个日期

默认是当前时间

1 //1.----------------创建日期  
2 NSDate *date = [NSDate date];//代表当前的时间点  
3 NSDate *date1 = [[NSDate alloc] init];  
4 NSLog(@"%@",date);  

2、增减时间点

1 date1 = [NSDate dateWithTimeIntervalSinceNow:1000];//单位是秒,在当前时间加上1000s,如果是减去一个时间,直接使用负值就可以了  
2 NSLog(@"%@",date);  

方法是一个,如果是减去时间点的话,直接用负值

3、从1970年开始到现在的时间戳

1 //时间戳:某个日期到1970年之间的一个差值,这个值是很大的  
2 NSDate *date2 = [NSDate dateWithTimeIntervalSince1970:1000];//参数为时间戳的大小 
 

计算机中有一个特别的时间:1970年,这个是时间戳的开始点,系统时钟都是相对于这个时间点来计算的。

4、创建一个日期,然后获取他的时间戳

1 //创建一个日期,然后拿到时间戳  
2 NSDate *now = [NSDate date];  
3 NSTimeInterval interval = [now timeIntervalSince1970];  
4 interval = [now timeIntervalSinceNow];//到当前时间的一个差值  

这个时间戳就是和1970年相比,比他早多少个值,这就是俗称的时间戳

5、日期的比较

 1 //日期的比较  
 2 //通过调用日期对象的compare,或者通过两个日期之间的差值判断  
 3 NSComparisonResult result = [date compare:date1];  
 4 if(result == NSOrderedAscending){  
 5     //大于  
 6 }else if(result == NSOrderedDescending){  
 7     //小于  
 8 }else{  
 9     //等于  
10 }  

6、日期的格式化(日期转化成字符串)

1 //日期格式化  
2 NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];  
3 [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];  
4 NSString *str = [dateFormatter stringFromDate:date];  
5 NSLog(@"%@",str); 

7、设置时区

1 //设置时区  
2 NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"America/New_York"];  
3 [dateFormatter setTimeZone:timeZone];
 

但是我们看到这个时区值我们该怎么获取呢?不可能死记硬背呀?这里,我们可以打印一个值:

1 //下面的方法是从格林时区开始添加和减去一个时区值(格林时区为0)  
2 //[NSTimeZone timeZoneForSecondsFromGMT:0];  
3   
4 //通过打印可以得到具体的时区  
5 NSArray *array = [NSTimeZone knownTimeZoneNames];//获取所有的时区  
6 for(NSString *str in array){  
7     NSLog(@"%@",str);  
8 }

 这样我们就可以获取具体的时区值了:

8、将字符串转化成日期

1 //将字符串转化成日期对象  
2 NSString *strs = @"2013年12月14日 16:31:08";  
3 [dateFormatter setDateFormat:@"yyyy年MM月dd日 HH:mm:ss"];  
4 date1 = [dateFormatter dateFromString:strs]; 

 

三、NSException

这个类和Java中的Exception类一样,用于捕获异常的,增加程序的健壮性,用法很简单,如下:

 1 //  
 2 //  main.m  
 3 //  23_Exception  
 4 //  
 5 //  Created by jiangwei on 14-10-12.  
 6 //  Copyright (c) 2014年 jiangwei. All rights reserved.  
 7 //  
 8   
 9 #import <Foundation/Foundation.h>  
10   
11 int main(int argc, const charchar * argv[]) {  
12     @autoreleasepool {  
13        //捕获异常  
14         @try {  
15             int a = 1/0;  
16         }  
17         @catch (NSException *exception) {  
18               
19         }  
20         @finally {  
21               
22         }  
23     }  
24     return 0;  
25 } 

 

总结

这一篇就介绍了Foundation框架中的三个常用的类:NSNumber/NSDate/NSException,那么到这里我们对Foundation中的类的解读也算是告一段落了,其实Foundation中还有其他类,后面会用到,用多了自然就知道他怎么用的了。

posted on 2015-01-03 13:39  I.L.L  阅读(182)  评论(0编辑  收藏  举报