ios-基础之【9】-NSNumber,NSDate,NSExcetion

原文:http://blog.csdn.net/jiangwei0910410003/article/details/41852835


1、NSNumber

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

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

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

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

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

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  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];  
  1.         //解包  
  2.         int value = [intNumber intValue];  
  3.         float values = [floatNumber floatValue];  
  4.         NSString *str = [intNumber stringValue];  
  5.           
  6.         //优化语法  
  7.         NSNumber *intNumbers = @12;  
  8.           
  9.           
  10.         //如何将结构体存入到数组中  
  11.         //使用NSValue对结构体进行封装  
  12.         //NSValue是NSNumber的父类  
  13.         //封包  
  14.         NSRange rang = {1,3};  
  15.         NSValue *v = [NSValue valueWithRange:rang];  
  16.           
  17.         //解包  
  18.         rang = [v rangeValue];  
  19.           
  20.           
  21.         //对自定义的结构体进行封包  
  22.         struct WXPoint{  
  23.             float x;  
  24.             float y;  
  25.         };  
  26.           
  27.         struct WXPoint p = {50,100};  
  28.         //第一个参数是结构体的变量地址,第二个参数是类型  
  29.         NSValue *v1 = [NSValue value:&p withObjCType:@encode(struct WXPoint)];  
  30.           
  31.         //解包  
  32.         struct WXPoint p1;  
  33.         [v1 getValue:&p1];  
  34.           
  35.           
  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);  
  9.           
  10.           
  11.     }  
  12.     return 0;  
  13. }  


1、封包和解包

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  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类中有基本类型对应的方法,可以这么操作的,不过值得一提的是:

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. NSString *str = [intNumber stringValue];  
  2. NSLog(@"%@",str);  
我们看到,intNumber是用包装int类型的,但是我们可以使用stringValue方法进行解包,这个就相当于int类型转化成NSString类型了,这个需要注意了,同样反过来也是可以的。

运行结果:



2、优化创建方式

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. //优化语法  
  2. NSNumber *intNumbers = @12;  
貌似和创建字符串方式很类似。


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

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  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、对自定义结构体类型进行自动封包和解包

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  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. //解包  
  1. struct WXPoint p1;  
  2. [v1 getValue:&p1];  
对于自定义的结构体类型,我们在封包的时候需要使用value:withObjCType:方法来进行操作了,需要使用 @encode(struct WXPoint) 传递进去,这个作用就是相当于把结构体类型传递过去。

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


5、对空值进行封装

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  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中操作日期的类,他的用处也是很多的,后面会说到定时器,就会用到这个类

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  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];//到当前时间的一个差值  
  1.         //日期的比较  
  2.         //通过调用日期对象的compare,或者通过两个日期之间的差值判断  
  3.         NSComparisonResult result = [date compare:date1];  
  4.         if(result == NSOrderedAscending){  
  5.             //大于  
  6.         }else if(result == NSOrderedDescending){  
  7.             //小于  
  8.         }else{  
  9.             //等于  
  10.         }  
  11.           
  12.           
  13.         //日期格式化  
  14.         NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];  
  15.         [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];  
  16.         NSString *str = [dateFormatter stringFromDate:date];  
  17.         NSLog(@"%@",str);  
  18.           
  19.           
  20.         //设置时区  
  21.         NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"America/New_York"];  
  22.         [dateFormatter setTimeZone:timeZone];  
  23.           
  24.         //下面的方法是从格林时区开始添加和减去一个时区值(格林时区为0)  
  25.         //[NSTimeZone timeZoneForSecondsFromGMT:0];  
  26.           
  27.         //通过打印可以得到具体的时区  
  28.         NSArray *array = [NSTimeZone knownTimeZoneNames];//获取所有的时区  
  29.         for(NSString *str in array){  
  30.             NSLog(@"%@",str);  
  31.         }  
  32.           
  33.           
  34.         //将字符串转化成日期对象  
  35.         NSString *strs = @"2013年12月14日 16:31:08";  
  36.         [dateFormatter setDateFormat:@"yyyy年MM月dd日 HH:mm:ss"];  
  37.         date1 = [dateFormatter dateFromString:strs];  

  1.           
  2.     }  
  3.     return 0;  
  4. }  

1、创建一个日期

默认是当前时间

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. //1.----------------创建日期  
  2. NSDate *date = [NSDate date];//代表当前的时间点  
  3. NSDate *date1 = [[NSDate alloc] init];  
  4. NSLog(@"%@",date);  


2、增减时间点

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. date1 = [NSDate dateWithTimeIntervalSinceNow:1000];//单位是秒,在当前时间加上1000s,如果是减去一个时间,直接使用负值就可以了  
  2. NSLog(@"%@",date);  
方法是一个,如果是减去时间点的话,直接用负值


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

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. //时间戳:某个日期到1970年之间的一个差值,这个值是很大的  
  2. NSDate *date2 = [NSDate dateWithTimeIntervalSince1970:1000];//参数为时间戳的大小  
计算机中有一个特别的时间:1970年,这个是时间戳的开始点,系统时钟都是相对于这个时间点来计算的。


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

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. //创建一个日期,然后拿到时间戳  
  2. NSDate *now = [NSDate date];  
  3. NSTimeInterval interval = [now timeIntervalSince1970];  
  4. interval = [now timeIntervalSinceNow];//到当前时间的一个差值  
这个时间戳就是和1970年相比,比他早多少个值,这就是俗称的时间戳


5、日期的比较

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. //日期的比较  
  2. //通过调用日期对象的compare,或者通过两个日期之间的差值判断  
  3. NSComparisonResult result = [date compare:date1];  
  4. if(result == NSOrderedAscending){  
  5.     //大于  
  6. }else if(result == NSOrderedDescending){  
  7.     //小于  
  1. }else{  
  2.     //等于  
  3. }  


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

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  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、设置时区

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. //设置时区  
  2. NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"America/New_York"];  
  3. [dateFormatter setTimeZone:timeZone];  
但是我们看到这个时区值我们该怎么获取呢?不可能死记硬背呀?这里,我们可以打印一个值:

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. //下面的方法是从格林时区开始添加和减去一个时区值(格林时区为0)  
  2. //[NSTimeZone timeZoneForSecondsFromGMT:0];  
  1. //通过打印可以得到具体的时区  
  2. NSArray *array = [NSTimeZone knownTimeZoneNames];//获取所有的时区  
  3. for(NSString *str in array){  
  4.     NSLog(@"%@",str);  
  5. }  
这样我们就可以获取具体的时区值了:

8、将字符串转化成日期

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  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类一样,用于捕获异常的,增加程序的健壮性,用法很简单,如下:

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  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;  
  1.  }  
  2.         @catch (NSException *exception) {  
  3.               
  4.         }  
  5.         @finally {  
  6.               
  7.         }  
  8.     }  
  9.     return 0;  
  10. }  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值