⼀、NSDate
1、⺴络请求中的时间戳
计算当前时间距离1970年1⽉1⽇的秒数
2、关于时区
24个时区 北京东八区
NSDate输出的永远是0时区的时间 英国
格林尼治时间 GMT Greenwich Mean Time
3、NSDate使用
// 创建日期:表示当前的时间
NSDate * nowDate = [NSDate date];
// 创建日期:以当前时间为参考点,创建表示昨天这个时间的日期对象
double oneDay = 24*3600;
NSDate * yesterday = [NSDate dateWithTimeIntervalSinceNow:-oneDay];
NSDate * since2001 = [NSDate dateWithTimeIntervalSinceReferenceDate:0];
NSDate * since1970 = [NSDate dateWithTimeIntervalSince1970:0];
NSDate * sinceAnyDay = [NSDate dateWithTimeInterval:oneDay sinceDate:since2001];
// NSTimeInterval 是double类型
NSTimeInterval interval = [sinceAnyDay timeIntervalSinceDate:since2001];
// 获取时间戳: 当前时间距离1970之间的时间差
NSTimeInterval time = [[NSDate date] timeIntervalSince1970];
⼆、掌握NSDateFormatter的使⽤
#pragma mark -- NSDateFormatter 日期格式化类 --
// NSDate to NSString
NSDateFormatter * format1 = [[NSDateFormatter alloc] init];
// 设定格式
// 年y 月M 日d 小时h(1-12 am/pm) H(0-23) 分m 秒s z时区
[format1 setDateFormat:@"y-M-d h:m:s MMMM zzzz"];
NSString * str1 = [format1 stringFromDate:[NSDate date]];
// NSString to Date
NSString * timeStr = @"2014年5月1日 10点23分22秒";
NSDateFormatter * format2 = [[NSDateFormatter alloc] init];
[format2 setDateFormat:@"y年M月d日 h点m分s秒"];
NSDate * date = [format2 dateFromString:timeStr];
三、类目Category的定义和使⽤
1、类目的作用
为原始的类扩展新的方法,扩展的方法会成为原始类的一部分,亦可被子类继承
2、创建文件
Command+N -> source -> Objective-c File ->
File:Addition
File Type:Category
Class:NSString
3、类目的使用
NSString+Addition.h
// 类目的接口部分
// 类目通常是给没有源代码的类添加新的方法。备注:不能添加实例变量!!!
@interface NSString (Addition)
- (NSUInteger)length; // Never do It! 可以但绝对不允许在类目中重新实现已经定义的方法. //因为类目中方法的优先级高于源代码中的方法(但系统方法除外[有保护])
- (void)str_sayHi; // 推荐:类目的方法名加前缀
@end
NSString+Addition.m
// 类目的实现部分
@implementation NSString (Addition)
- (void)str_sayHi
{
// 在实例方法中,self表示调用这个方法的对象
NSLog(@"%@", self);
}
@end
四、Extension(延展)
延展是匿名的类目
延展的作用
延展要写在.m文件中,主要作用是管理“私有”方法
优点
外部声明与内部延展区分开,提高代码质量,提高可读性。方便管理
使用
.h文件是提供类的外部使用的; .m是类自己使用的,不对外公开。
延展只有接口部分,没有实现部分。在类的实现部分实现延展的方法
Person.m:
@interface Person ()
{
NSString * _gender;
}
// 自我介绍
- (void)introduce;
// 不要以_开头,_是系统类用的
- (void)p_sayHello;
@end
@implementation Person
- (void)sayHi
{
[self introduce];
}
- (void)introduce
{
NSLog(@"Extension: introduce method");
}
- (void)p_sayHello
{
NSLog(@"Hello Extension");
}
@end
五、Protocol(协议)
1、定义协议
协议是⼀套标准(⼀堆⽅法的声明),只有.h⽂件。
Command+N -> source -> Objective-c File ->
File:MarryProtocol
File Type:Protocol
@protocol MarryProtocol <NSObject>
// 必须实现(默认)
@required
- (void)makeMoney;
// 可选实现
@optional
- (void)cook;
- (void)wash;
@end
2、遵守协议
分两步:
1、在类的.h⽂件 ⽗类名后写上<协议名>。
2、在.m⽂件中实现协议中的⽅法。
Boy.h:
#import <Foundation/Foundation.h>
#import "MarryProtocol.h"
@interface Boy : NSObject <MarryProtocol>
@end
Boy.m:
#import "Boy.h"
@implementation Boy
- (void)makeMoney
{
NSLog(@"boy makeMoney");
}
- (void)wash
{
NSLog(@"boy wash");
}
- (void)cook
{
NSLog(@"boy cook");
}
@end
承上
协议作用:解耦合
Protocol的核⼼使⽤场景是实现delegate设计模式。
协议方法<==>委托方法
启下
六、delegate
代理设计模式内容
找代理的对象(家庭),作为代理的对象(保姆)
代理设计模式实现
(1)找代理的对象(家庭)定义协议,协议中是代理对象(保姆)需要实现的方法
(2)作为代理的对象(保姆)要遵守协议,实现协议方法
(3)设置代理对象
家庭类,保姆类 让保姆对象作为家庭的代理,实现:看小孩、做饭
FamilyProtocol.h
@protocol FamilyProtocol <NSObject>
@required
- (void)cook;
@optional
- (void)lookAfterBaby;
@end
Housemaid.h
#import "FamilyProtocol.h"
@interface Housemaid : NSObject <FamilyProtocol>
@end
Housemaid.m
@implementation Housemaid
- (void)lookAfterBaby{
NSLog(@"Housemaid take care of Baby");
}
- (void)cook{
NSLog(@"Housemaind cook.");
}
@end
Family.h
#import "FamilyProtocol.h"
#import "Housemaid.h"
@interface Family : NSObject{
Housemaid<FamilyProtocol> * _delegate;
}
#pragma mark -- delegate的setter方法 --
- (void)setDelegate:(id<FamilyProtocol>)delegate;
- (void)hungry;
- (void)cry;
@end
Family.m
@implementation Family
#pragma mark -- delegate的setter方法 --
- (void)setDelegate:(id<FamilyProtocol>)delegate
{
_delegate = delegate;
}
- (void)hungry
{
NSLog(@"Hungry!");
if ([_delegate respondsToSelector:@selector(cook)]) {
[_delegate cook];
}
}
- (void)cry
{
NSLog(@"The baby is crying");
if ([_delegate respondsToSelector:@selector(lookAfterBaby)]) {
[_delegate lookAfterBaby];
}
}
@end
main.m
...
Housemaid * h = [[Housemaid alloc] init];
Family * f = [[Family alloc] init];
[f setDelegate:h];
[f hungry];
[f cry];
...
扩展类的四种方法:1:类目、2:延展、3:协议、4:子类(、5:修改源代码)