ios-基础之【9】-NSNumber,NSDate,NSExcetion
2016-03-13 11:37
573 查看
原文:http://blog.csdn.net/jiangwei0910410003/article/details/41852835
1、NSNumber
这个类主要是用来封装基本类型的,说到这里,就不得不说一下了:
OC中的集合是不允许存入基本类型的,所以NSNumber类就诞生了,需要将基本类型封装一下,然后存进去,这个类似于Java中的自动装箱和拆箱,Java中的集合其实也是不允许存入基本类型的,但是我们任然看可以那么操作,就是因为有自动装箱功能,如果你将Eclipse的JDK改成5.0之前的,你看看还能操作吗。。
注:那为什么基本类型不能存入到集合中呢?
原因是在操作集合的时候会操作集合元素中的方法,但是基本类型是没有方法的。
从这一点上我们就可以看出NSNumber是很重要的,后面一定会经常用到。
[objc] view
plain copy
//
// main.m
// 21_NSNumber
//
// Created by jiangwei on 14-10-12.
// Copyright (c) 2014年 jiangwei.&nb
4000
sp;All rights reserved.
//
#import <Foundation/Foundation.h>
//包装基本数据类型
int main(int argc, const charchar * argv[]) {
@autoreleasepool {
//1.----------------创建NSNumber
//封包
NSNumber *intNumber = [NSNumber numberWithInt:3];
NSNumber *floatNumber = [NSNumber numberWithFloat:9.8f];
NSArray *array = @[intNumber,floatNumber];
//解包
int value = [intNumber intValue];
float values = [floatNumber floatValue];
NSString *str = [intNumber stringValue];
//优化语法
NSNumber *intNumbers = @12;
//如何将结构体存入到数组中
//使用NSValue对结构体进行封装
//NSValue是NSNumber的父类
//封包
NSRange rang = {1,3};
NSValue *v = [NSValue valueWithRange:rang];
//解包
rang = [v rangeValue];
//对自定义的结构体进行封包
struct WXPoint{
float x;
float y;
};
struct WXPoint p = {50,100};
//第一个参数是结构体的变量地址,第二个参数是类型
NSValue *v1 = [NSValue value:&p withObjCType:@encode(struct WXPoint)];
//解包
struct WXPoint p1;
[v1 getValue:&p1];
//NSNULL的使用
//数组中是没有办法存放一个空对象的nil
//NSArray *nilArray = @[nil,nil,nil];//报错的
//有时候我们需要在数组中存入一个空对象的需求
NSNull *n1 = [NSNull null];
NSNull *n2 = [NSNull null];
NSArray *nullArray = @[n1,n2];
NSLog(@"nullArray =%@",nullArray);
}
return 0;
}
1、封包和解包
[objc] view
plain copy
//1.----------------创建NSNumber
//封包
NSNumber *intNumber = [NSNumber numberWithInt:3];
NSNumber *floatNumber = [NSNumber numberWithFloat:9.8f];
NSArray *array = @[intNumber,floatNumber];
//解包
int value = [intNumber intValue];
float values = [floatNumber floatValue];
NSString *str = [intNumber stringValue];
NSNumber类中有基本类型对应的方法,可以这么操作的,不过值得一提的是:
[objc] view
plain copy
NSString *str = [intNumber stringValue];
NSLog(@"%@",str);
我们看到,intNumber是用包装int类型的,但是我们可以使用stringValue方法进行解包,这个就相当于int类型转化成NSString类型了,这个需要注意了,同样反过来也是可以的。
运行结果:
2、优化创建方式
[java] view
plain copy
//优化语法
NSNumber *intNumbers = @12;
貌似和创建字符串方式很类似。
3、结构体类型的自动封包和解包
[objc] view
plain copy
//如何将结构体存入到数组中
//使用NSValue对结构体进行封装
//NSValue是NSNumber的父类
//封包
NSRange rang = {1,3};
NSValue *v = [NSValue valueWithRange:rang];
//解包
rang = [v rangeValue];
在OC中还有一个结构体类型,他也是不能直接存入到集合类中的,对他进行封装的时NSValue类,不是NSNumber类了。
4、对自定义结构体类型进行自动封包和解包
[objc] view
plain copy
//对自定义的结构体进行封包
struct WXPoint{
float x;
float y;
};
struct WXPoint p = {50,100};
//第一个参数是结构体的变量地址,第二个参数是类型
NSValue *v1 = [NSValue value:&p withObjCType:@encode(struct WXPoint)];
//解包
struct WXPoint p1;
[v1 getValue:&p1];
对于自定义的结构体类型,我们在封包的时候需要使用value:withObjCType:方法来进行操作了,需要使用@encode(struct
WXPoint)传递进去,这个作用就是相当于把结构体类型传递过去。
记住:在对自定义结构体类型进行封包的时候需要传递结构体类型
5、对空值进行封装
[java] view
plain copy
//NSNULL的使用
//数组中是没有办法存放一个空对象的nil
//NSArray *nilArray = @[nil,nil,nil];//报错的
//有时候我们需要在数组中存入一个空对象的需求
NSNull *n1 = [NSNull null];
NSNull *n2 = [NSNull null];
NSArray *nullArray = @[n1,n2];
NSLog(@"nullArray =%@",nullArray);
首先我们要了解一下,为什么会有这么需求:需要将空值存入到集合中,我们后面会说到具体的应用
那么这里需要使用NSNull来进行封包和解包
二、NSDate
这个类是OC中操作日期的类,他的用处也是很多的,后面会说到定时器,就会用到这个类
[objc] view
plain copy
//
// main.m
// 22_NSDate
//
// Created by jiangwei on 14-10-12.
// Copyright (c) 2014年 jiangwei. All rights reserved.
//
#import <Foundation/Foundation.h>
int main(int argc, const charchar * argv[]) {
@autoreleasepool {
//1.----------------创建日期
NSDate *date = [NSDate date];//代表当前的时间点
NSDate *date1 = [[NSDate alloc] init];
NSLog(@"%@",date);
date1 = [NSDate dateWithTimeIntervalSinceNow:1000];//单位是秒,在当前时间加上1000s,如果是减去一个时间,直接使用负值就可以了
NSLog(@"%@",date);
//时间戳:某个日期到1970年之间的一个差值,这个值是很大的
NSDate *date2 = [NSDate dateWithTimeIntervalSince1970:1000];//参数为时间戳的大小
//创建一个日期,然后拿到时间戳
NSDate *now = [NSDate date];
NSTimeInterval interval = [now timeIntervalSince1970];
interval = [now timeIntervalSinceNow];//到当前时间的一个差值
//日期的比较
//通过调用日期对象的compare,或者通过两个日期之间的差值判断
NSComparisonResult result = [date compare:date1];
if(result == NSOrderedAscending){
//大于
}else if(result == NSOrderedDescending){
//小于
}else{
//等于
}
//日期格式化
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSString *str = [dateFormatter stringFromDate:date];
NSLog(@"%@",str);
//设置时区
NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"America/New_York"];
[dateFormatter setTimeZone:timeZone];
//下面的方法是从格林时区开始添加和减去一个时区值(格林时区为0)
//[NSTimeZone timeZoneForSecondsFromGMT:0];
//通过打印可以得到具体的时区
NSArray *array = [NSTimeZone knownTimeZoneNames];//获取所有的时区
for(NSString *str in array){
NSLog(@"%@",str);
}
//将字符串转化成日期对象
NSString *strs = @"2013年12月14日 16:31:08";
[dateFormatter setDateFormat:@"yyyy年MM月dd日 HH:mm:ss"];
date1 = [dateFormatter dateFromString:strs];
}
return 0;
}
1、创建一个日期
默认是当前时间
[java] view
plain copy
//1.----------------创建日期
NSDate *date = [NSDate date];//代表当前的时间点
NSDate *date1 = [[NSDate alloc] init];
NSLog(@"%@",date);
2、增减时间点
[java] view
plain copy
date1 = [NSDate dateWithTimeIntervalSinceNow:1000];//单位是秒,在当前时间加上1000s,如果是减去一个时间,直接使用负值就可以了
NSLog(@"%@",date);
方法是一个,如果是减去时间点的话,直接用负值
3、从1970年开始到现在的时间戳
[java] view
plain copy
//时间戳:某个日期到1970年之间的一个差值,这个值是很大的
NSDate *date2 = [NSDate dateWithTimeIntervalSince1970:1000];//参数为时间戳的大小
计算机中有一个特别的时间:1970年,这个是时间戳的开始点,系统时钟都是相对于这个时间点来计算的。
4、创建一个日期,然后获取他的时间戳
[java] view
plain copy
//创建一个日期,然后拿到时间戳
NSDate *now = [NSDate date];
NSTimeInterval interval = [now timeIntervalSince1970];
interval = [now timeIntervalSinceNow];//到当前时间的一个差值
这个时间戳就是和1970年相比,比他早多少个值,这就是俗称的时间戳
5、日期的比较
[objc] view
plain copy
//日期的比较
//通过调用日期对象的compare,或者通过两个日期之间的差值判断
NSComparisonResult result = [date compare:date1];
if(result == NSOrderedAscending){
//大于
}else if(result == NSOrderedDescending){
//小于
}else{
//等于
}
6、日期的格式化(日期转化成字符串)
[objc] view
plain copy
//日期格式化
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSString *str = [dateFormatter stringFromDate:date];
NSLog(@"%@",str);
7、设置时区
[objc] view
plain copy
//设置时区
NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"America/New_York"];
[dateFormatter setTimeZone:timeZone];
但是我们看到这个时区值我们该怎么获取呢?不可能死记硬背呀?这里,我们可以打印一个值:
[objc] view
plain copy
//下面的方法是从格林时区开始添加和减去一个时区值(格林时区为0)
//[NSTimeZone timeZoneForSecondsFromGMT:0];
//通过打印可以得到具体的时区
NSArray *array = [NSTimeZone knownTimeZoneNames];//获取所有的时区
for(NSString *str in array){
NSLog(@"%@",str);
}
这样我们就可以获取具体的时区值了:
8、将字符串转化成日期
[java] view
plain copy
//将字符串转化成日期对象
NSString *strs = @"2013年12月14日 16:31:08";
[dateFormatter setDateFormat:@"yyyy年MM月dd日 HH:mm:ss"];
date1 = [dateFormatter dateFromString:strs];
三、NSException
这个类和Java中的Exception类一样,用于捕获异常的,增加程序的健壮性,用法很简单,如下:
[objc] view
plain copy
//
// main.m
// 23_Exception
//
// Created by jiangwei on 14-10-12.
// Copyright (c) 2014年 jiangwei. All rights reserved.
//
#import <Foundation/Foundation.h>
int main(int argc, const charchar * argv[]) {
@autoreleasepool {
//捕获异常
@try {
int a = 1/0;
}
@catch (NSException *exception) {
}
@finally {
}
}
return 0;
}
1、NSNumber
这个类主要是用来封装基本类型的,说到这里,就不得不说一下了:
OC中的集合是不允许存入基本类型的,所以NSNumber类就诞生了,需要将基本类型封装一下,然后存进去,这个类似于Java中的自动装箱和拆箱,Java中的集合其实也是不允许存入基本类型的,但是我们任然看可以那么操作,就是因为有自动装箱功能,如果你将Eclipse的JDK改成5.0之前的,你看看还能操作吗。。
注:那为什么基本类型不能存入到集合中呢?
原因是在操作集合的时候会操作集合元素中的方法,但是基本类型是没有方法的。
从这一点上我们就可以看出NSNumber是很重要的,后面一定会经常用到。
[objc] view
plain copy
//
// main.m
// 21_NSNumber
//
// Created by jiangwei on 14-10-12.
// Copyright (c) 2014年 jiangwei.&nb
4000
sp;All rights reserved.
//
#import <Foundation/Foundation.h>
//包装基本数据类型
int main(int argc, const charchar * argv[]) {
@autoreleasepool {
//1.----------------创建NSNumber
//封包
NSNumber *intNumber = [NSNumber numberWithInt:3];
NSNumber *floatNumber = [NSNumber numberWithFloat:9.8f];
NSArray *array = @[intNumber,floatNumber];
//解包
int value = [intNumber intValue];
float values = [floatNumber floatValue];
NSString *str = [intNumber stringValue];
//优化语法
NSNumber *intNumbers = @12;
//如何将结构体存入到数组中
//使用NSValue对结构体进行封装
//NSValue是NSNumber的父类
//封包
NSRange rang = {1,3};
NSValue *v = [NSValue valueWithRange:rang];
//解包
rang = [v rangeValue];
//对自定义的结构体进行封包
struct WXPoint{
float x;
float y;
};
struct WXPoint p = {50,100};
//第一个参数是结构体的变量地址,第二个参数是类型
NSValue *v1 = [NSValue value:&p withObjCType:@encode(struct WXPoint)];
//解包
struct WXPoint p1;
[v1 getValue:&p1];
//NSNULL的使用
//数组中是没有办法存放一个空对象的nil
//NSArray *nilArray = @[nil,nil,nil];//报错的
//有时候我们需要在数组中存入一个空对象的需求
NSNull *n1 = [NSNull null];
NSNull *n2 = [NSNull null];
NSArray *nullArray = @[n1,n2];
NSLog(@"nullArray =%@",nullArray);
}
return 0;
}
1、封包和解包
[objc] view
plain copy
//1.----------------创建NSNumber
//封包
NSNumber *intNumber = [NSNumber numberWithInt:3];
NSNumber *floatNumber = [NSNumber numberWithFloat:9.8f];
NSArray *array = @[intNumber,floatNumber];
//解包
int value = [intNumber intValue];
float values = [floatNumber floatValue];
NSString *str = [intNumber stringValue];
NSNumber类中有基本类型对应的方法,可以这么操作的,不过值得一提的是:
[objc] view
plain copy
NSString *str = [intNumber stringValue];
NSLog(@"%@",str);
我们看到,intNumber是用包装int类型的,但是我们可以使用stringValue方法进行解包,这个就相当于int类型转化成NSString类型了,这个需要注意了,同样反过来也是可以的。
运行结果:
2、优化创建方式
[java] view
plain copy
//优化语法
NSNumber *intNumbers = @12;
貌似和创建字符串方式很类似。
3、结构体类型的自动封包和解包
[objc] view
plain copy
//如何将结构体存入到数组中
//使用NSValue对结构体进行封装
//NSValue是NSNumber的父类
//封包
NSRange rang = {1,3};
NSValue *v = [NSValue valueWithRange:rang];
//解包
rang = [v rangeValue];
在OC中还有一个结构体类型,他也是不能直接存入到集合类中的,对他进行封装的时NSValue类,不是NSNumber类了。
4、对自定义结构体类型进行自动封包和解包
[objc] view
plain copy
//对自定义的结构体进行封包
struct WXPoint{
float x;
float y;
};
struct WXPoint p = {50,100};
//第一个参数是结构体的变量地址,第二个参数是类型
NSValue *v1 = [NSValue value:&p withObjCType:@encode(struct WXPoint)];
//解包
struct WXPoint p1;
[v1 getValue:&p1];
对于自定义的结构体类型,我们在封包的时候需要使用value:withObjCType:方法来进行操作了,需要使用@encode(struct
WXPoint)传递进去,这个作用就是相当于把结构体类型传递过去。
记住:在对自定义结构体类型进行封包的时候需要传递结构体类型
5、对空值进行封装
[java] view
plain copy
//NSNULL的使用
//数组中是没有办法存放一个空对象的nil
//NSArray *nilArray = @[nil,nil,nil];//报错的
//有时候我们需要在数组中存入一个空对象的需求
NSNull *n1 = [NSNull null];
NSNull *n2 = [NSNull null];
NSArray *nullArray = @[n1,n2];
NSLog(@"nullArray =%@",nullArray);
首先我们要了解一下,为什么会有这么需求:需要将空值存入到集合中,我们后面会说到具体的应用
那么这里需要使用NSNull来进行封包和解包
二、NSDate
这个类是OC中操作日期的类,他的用处也是很多的,后面会说到定时器,就会用到这个类
[objc] view
plain copy
//
// main.m
// 22_NSDate
//
// Created by jiangwei on 14-10-12.
// Copyright (c) 2014年 jiangwei. All rights reserved.
//
#import <Foundation/Foundation.h>
int main(int argc, const charchar * argv[]) {
@autoreleasepool {
//1.----------------创建日期
NSDate *date = [NSDate date];//代表当前的时间点
NSDate *date1 = [[NSDate alloc] init];
NSLog(@"%@",date);
date1 = [NSDate dateWithTimeIntervalSinceNow:1000];//单位是秒,在当前时间加上1000s,如果是减去一个时间,直接使用负值就可以了
NSLog(@"%@",date);
//时间戳:某个日期到1970年之间的一个差值,这个值是很大的
NSDate *date2 = [NSDate dateWithTimeIntervalSince1970:1000];//参数为时间戳的大小
//创建一个日期,然后拿到时间戳
NSDate *now = [NSDate date];
NSTimeInterval interval = [now timeIntervalSince1970];
interval = [now timeIntervalSinceNow];//到当前时间的一个差值
//日期的比较
//通过调用日期对象的compare,或者通过两个日期之间的差值判断
NSComparisonResult result = [date compare:date1];
if(result == NSOrderedAscending){
//大于
}else if(result == NSOrderedDescending){
//小于
}else{
//等于
}
//日期格式化
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSString *str = [dateFormatter stringFromDate:date];
NSLog(@"%@",str);
//设置时区
NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"America/New_York"];
[dateFormatter setTimeZone:timeZone];
//下面的方法是从格林时区开始添加和减去一个时区值(格林时区为0)
//[NSTimeZone timeZoneForSecondsFromGMT:0];
//通过打印可以得到具体的时区
NSArray *array = [NSTimeZone knownTimeZoneNames];//获取所有的时区
for(NSString *str in array){
NSLog(@"%@",str);
}
//将字符串转化成日期对象
NSString *strs = @"2013年12月14日 16:31:08";
[dateFormatter setDateFormat:@"yyyy年MM月dd日 HH:mm:ss"];
date1 = [dateFormatter dateFromString:strs];
}
return 0;
}
1、创建一个日期
默认是当前时间
[java] view
plain copy
//1.----------------创建日期
NSDate *date = [NSDate date];//代表当前的时间点
NSDate *date1 = [[NSDate alloc] init];
NSLog(@"%@",date);
2、增减时间点
[java] view
plain copy
date1 = [NSDate dateWithTimeIntervalSinceNow:1000];//单位是秒,在当前时间加上1000s,如果是减去一个时间,直接使用负值就可以了
NSLog(@"%@",date);
方法是一个,如果是减去时间点的话,直接用负值
3、从1970年开始到现在的时间戳
[java] view
plain copy
//时间戳:某个日期到1970年之间的一个差值,这个值是很大的
NSDate *date2 = [NSDate dateWithTimeIntervalSince1970:1000];//参数为时间戳的大小
计算机中有一个特别的时间:1970年,这个是时间戳的开始点,系统时钟都是相对于这个时间点来计算的。
4、创建一个日期,然后获取他的时间戳
[java] view
plain copy
//创建一个日期,然后拿到时间戳
NSDate *now = [NSDate date];
NSTimeInterval interval = [now timeIntervalSince1970];
interval = [now timeIntervalSinceNow];//到当前时间的一个差值
这个时间戳就是和1970年相比,比他早多少个值,这就是俗称的时间戳
5、日期的比较
[objc] view
plain copy
//日期的比较
//通过调用日期对象的compare,或者通过两个日期之间的差值判断
NSComparisonResult result = [date compare:date1];
if(result == NSOrderedAscending){
//大于
}else if(result == NSOrderedDescending){
//小于
}else{
//等于
}
6、日期的格式化(日期转化成字符串)
[objc] view
plain copy
//日期格式化
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSString *str = [dateFormatter stringFromDate:date];
NSLog(@"%@",str);
7、设置时区
[objc] view
plain copy
//设置时区
NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"America/New_York"];
[dateFormatter setTimeZone:timeZone];
但是我们看到这个时区值我们该怎么获取呢?不可能死记硬背呀?这里,我们可以打印一个值:
[objc] view
plain copy
//下面的方法是从格林时区开始添加和减去一个时区值(格林时区为0)
//[NSTimeZone timeZoneForSecondsFromGMT:0];
//通过打印可以得到具体的时区
NSArray *array = [NSTimeZone knownTimeZoneNames];//获取所有的时区
for(NSString *str in array){
NSLog(@"%@",str);
}
这样我们就可以获取具体的时区值了:
8、将字符串转化成日期
[java] view
plain copy
//将字符串转化成日期对象
NSString *strs = @"2013年12月14日 16:31:08";
[dateFormatter setDateFormat:@"yyyy年MM月dd日 HH:mm:ss"];
date1 = [dateFormatter dateFromString:strs];
三、NSException
这个类和Java中的Exception类一样,用于捕获异常的,增加程序的健壮性,用法很简单,如下:
[objc] view
plain copy
//
// main.m
// 23_Exception
//
// Created by jiangwei on 14-10-12.
// Copyright (c) 2014年 jiangwei. All rights reserved.
//
#import <Foundation/Foundation.h>
int main(int argc, const charchar * argv[]) {
@autoreleasepool {
//捕获异常
@try {
int a = 1/0;
}
@catch (NSException *exception) {
}
@finally {
}
}
return 0;
}
相关文章推荐
- [iOS]iOS GitHub Top 100 简介
- IOS开发之多线程 -- GCD的方方面面
- Github上600多个iOS开源项目分类及介绍
- ios-基础之【8】-NSDictionary
- ios-基础之【7】-NSArrary
- iOS GitHub Top 100 简介
- ios-基础之【6】-NSString
- iOS开发------响应TableView下拉设置NavigationBar的透明度
- iOS开发证书都显示“此证书的签发者无效”,更新WWDR Certificate证书后还是显示无效
- iOS边练边学--介绍布局的三种方法
- iOS GitHub Top 100 简介
- IOS应用程序生命周期
- iOS多线程编程之NSThread的使用
- iOS开发-进阶:利用通知(NSNotification)进行数据传递
- iOS开发-进阶:NSNotificationCenter 使用姿势详解
- iOS开发-基础: NSDate 以秒数加减
- iOS证书自助管理实现思路
- AudioManger和AudioSystem的关系
- AudioService 和AudioManager 以及使用举例.
- CoreImage 之 CIDetector iOS 人脸识别