系统中表示时间日期的类—-NSDate
NSDate打印时,描述方法默认打印0时区,所以时差为8小时
初始化方法:
初始化一个现在的时间
NSDate *date = [NSDate date];
初始化一个时间,为距离现在 n 秒之后的时间日期 (n = 3600 * 24)
NSDate *date = [NSDate dateWithTimeIntervalSinceNow:3600 * 24];
例如:昨天
NSDate date = [NSDate dateWithTimeIntervalSinceNow: - 3600 24];
初始化一个时间,为距离2001-1-1 00:00:00 n秒之后的时间 (n = 3600 )
NSDate *date = [NSDate dateWithTimeIntervalSinceReferenceDate:3600];
初始化一个时间,为距离1970-1-1 00:00:00 n秒之后的时间 (n = 3600)
NSDate *date = [NSDate dateWithTimeIntervalSince1970:3600];
把 NSDate 转化为 NSString 格式输出:
步骤1.初始化一个日期
NSDate *D = [NSDate date];
初始化一个日期格式对象
NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
添加一个格式
[formatter setDateFormat:@"yyyy年MM月dd日 HH点mm分ss秒"];
新建一个NSTimeZone,设置时区差为 0 (设置后不会有8小时的差)
NSTimeZone *zone = [NSTimeZone timeZoneForSecondsFromGMT:0];
在格式中设置NSTimeZone
[formatter setTimeZone:zone];
新建字符串,接收Date转换后的结果,并输出
NSString *str = [formatter stringFromDate:D]; NSLog(@"%@",str);
把 NSDate 转化为 NSString 格式输出:
初始化一个时间的字符串
NSString *str = @"2014年05月01日 10点23分18秒";
步骤2-5.同上
新建 NSDate 接收NSString转换后的Date,并输出
NSDate *D = [formatter dateFromString:str]; NSLog(@"%@",D);
类目—- Category
特点:可以给看不到实现的系统类添加方法,并且添加的方法。使用系统类的对象或者类名直接可以调用。 切记:只能添加方法,不能添加实例变量。类目中添加的方法,相当于直接添加到系统类中,是可以被继承的。
例:给 NSDate 类添加 dataWithDateString 方法,将字符串转化为 NSDate 格式
新建一个Objective-C File ,File Type 选为Category ,Class的选择系统已有的类,这里举例为:NSDate 。
在 .h 文件中声明类方法:
(NSDate *)dataWithDateString:(NSString *)str;
在 .m 文件中写方法的实现:
(NSDate *)dataWithDateString:(NSString *)str { NSDateFormatter *formatter = [[NSDateFormatter alloc]init]; [formatter setDateFormat:@"yyyyMMddHHmmss"]; NSTimeZone *zone = [NSTimeZone timeZoneForSecondsFromGMT:0]; [formatter setTimeZone:zone]; NSDate *date = [formatter dateFromString:str]; return date; }
在 main.m 文件中调用:(记得导入头文件)
NSString *string = @"20140402142850"; NSLog(@"%@",[NSDate dataWithDateString:string]);
延展—- Extension
方法一:
1.在 .m 文件的中写 @interface 类名 ()
@interface 类名 ()
2.在 @interface 和 @end 之间声明方法
@interface 类名 () - (void)sayHi; @end
3.在 @implementation 和 @end 之间写私有方法的实现
@implementation 类名 - (void)sayHi { NSLog(@"sayHi"); } @end
方法二:
延展中可以写实例变量和方法,并且是私有的实例变量和方法申明。
特点:一定要给有源代码的类创建延展,要不然毫无意义。并且声明的私有方法,需要去原类的.m文件中实现1.新建一个Objective-C File ,File Type 选为Extension ,Class的选择自己定义的类。在 .h 文件中声明方法。
@interface 类名 () - (void)sayHi; @end
2.在类中导入头文件,在 .m 文件中写私有方法的实现
@implementation 类名 - (void)sayHi { NSLog(@"sayHi"); } @end
代理—- Protocol
使用协议代理的步骤:
先创建协议
新建一个Objective-C File ,File Type 选为Protocol 。例子为:MarryProtocol
协议中 @required 为必须要实现的方法(也是默认的)。@optional 为可选择的实现。@required // 必须要实现的(也是默认的) - (void)makeMoney; @optional // 可选择实现的 - (void)makeCook;
遵守协议
在代理的类 .h 文件中:导入Protocol协议的头文件。例子为 Boy类
在@interface 类名 :NSObject@interface Boy : NSObject <MarryProtocol> // 遵守协议
实现协议中方法
在 Boy.m 文件中写协议中必须要写的方法
// 实现协议中的方法 - (void)makeMoney { NSLog(@"我去挣钱"); } - (void)makeCook { NSLog(@"好,我去做饭了"); }
添加代理对象为实例变量 (谁需要代理 就在那个类里声明实例变量)
在 Girl.h 文件中,导入协议的有文件
#import "MarryProtocol.h"
将代理对象作为实例变量。代理对象必须是遵守协议的对象
@interface Girl : NSObject { id<MarryProtocol> _delegate; }
添加设置代理对象的方法(set方法)
在 Girl.h 文件中声明set方法:
- (void)setDelegate:(id<MarryProtocol>)delegate;
在 Girl.m 文件中实现set方法:
// 添加设置代理的方法set - (void)setDelegate:(id<MarryProtocol>)delegate { _delegate = delegate; }
让代理去干活(让代理去调用协议中的方法)
在 Girl.m 文件的实现方法中调用代理
- (void)hungry { NSLog(@"我是女的,肚子饿了"); // 需要 你给她做饭 // 需要 代理去做饭 // 需要 代理去调用做饭的方法 // 需要 代理的对象去调用协议中的方法(因为代理对象实现了代理的方法) // 让代理去调用协议中的方法 // 判断一下 代理有没有实现这个方法 // respondsToSelector 方法 判断这个类中有没有实现某个方法 返回一个BOOL值 // 让代理去调用方法的一个安全保护 if ([_delegate respondsToSelector:@selector(makeCook)]) { [_delegate makeCook]; } }
从main函数创建对象 设置代理对象
在 main.m 中调用。首先导入 Boy.h 和 Girl.h ,创建 Boy 、Girl 对象,设置代理
Boy *b = [[Boy alloc]init]; Girl *g = [[Girl alloc]init]; // 设置代理 [g setDelegate:b]; [g hungry];
运行结果:
2015-11-03 20:59:52.094 LessonOCDay_7_Protocol[3068:277183] 我是女的,肚子饿了 2015-11-03 20:59:52.094 LessonOCDay_7_Protocol[3068:277183] 好,我去做饭了