您的位置:首页 > 编程语言 > C语言/C++

OC语言笔记(八):OC代理、协议和NSDate

2016-05-16 15:29 471 查看
一、NSDate

NSDate是一个关于时间的类,通过这个类可以获得我们的时间,并使用适合的方式变为字符串来使用

1、获得一个时间

NSDate *date = [NSDate date];

NSLog(@"%@",date);

2、得到一段时间之后的某个时间

NSDate *tomorrowDate = [NSDate dateWithTimeIntervalSinceNow:24*60*60];//第一个参数就是一个时间间隔

NSLog(@"%@",tomorrowDate);

NSDate *yesterdayDate = [NSDate dateWithTimeIntervalSinceNow:-24*60*60];

NSLog(@"%@",yesterdayDate);

3、格式化时间

NSDateFormatter *dateFormatter = [[NSDateFormatter
alloc]
init];//准备一个时间格式化对象,这个对象用来设置我们如何格式化一个时间

3.1
系统给定格式的格式化(日期格式化、时间格式化)

[dateFormatter setDateStyle:NSDateFormatterLongStyle];

[dateFormatter setTimeStyle:NSDateFormatterLongStyle];

NSLog(@"%@",[dateFormatter
stringFromDate:date]);//把当前时间转为字符串,根据我们设置的格式来打印

3.2
自定义日期和时间格式

[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss.SSS"];//参数是个字符串,字符串里就是格式化的标准

//yyyy是年,MM是月,dd是日,hh是小时,mm是分钟,ss是秒,SSS是毫秒

NSLog(@"%@",[dateFormatter
stringFromDate:date]);

//可以在任意两个标示符之间写入任意内容的字符串,这些字符串就将是格式化后的时间内容

NSDate *tenHourDate = [NSDate
dateWithTimeIntervalSinceNow:10*60*60];

NSLog(@"%@",[dateFormatter
stringFromDate:tenHourDate]);

4、计算两个日期的时间间隔

NSTimeInterval timeInterval = [tenHourDate
timeIntervalSinceDate:date];//第一个参数是一个日期,第二个参数是另一个日期,返回值是一个timeInterval的时间

NSLog(@"%d",(int)timeInterval);

5、日历

NSCalendar *calendar = [[NSCalendar
alloc]
initWithCalendarIdentifier:NSGregorianCalendar];//一个日历对象

NSDateComponents *com = [[NSDateComponents
alloc]
init];//一个日历中元素的对象

//设置日历元素对象的集合,(选择你想要用的那些元素)

NSInteger flag =
NSYearCalendarUnit | NSMonthCalendarUnit |
NSDayCalendarUnit | NSHourCalendarUnit |
NSMinuteCalendarUnit | NSSecondCalendarUnit |
NSWeekdayCalendarUnit;

com = [calendar components:flag
fromDate:date];//第一个参数就是上面做的元素对象的集合

int year = [com
year];

int month = [com
month];

int day = [com
day];

int hour = [com
hour];

int minute = [com
minute];

int second = [com
second];

int week = [com
weekday];

if (week == 1) {

week = week+6;

}else{

week = week-1;

}

NSLog(@"%d年%d月%d日%d时%d分%d秒星期%d",year,month,day,hour,minute,second,week);

NSDate *theDayAfterTomorrowAfterTomorrow = [NSDate
dateWithTimeIntervalSinceNow:96*60*60];

com = [calendar components:flag
fromDate:theDayAfterTomorrowAfterTomorrow];

NSLog(@"%d",[com
weekday]);

二、协议

协议:一个类中做一个协议,这个协议里有一些方法,另一个类遵守这个协议,并自由实现协议方法的内容

1、设置协议方法一:建一个类,在类中声明一个协议

1.1声明一个Company类,在类中声明一个CompanyDelegate协议(在.h文件中声明)

#import <Foundation/Foundation.h>

//正式协议:@required的协议,非正式协议:@optional的协议

//protocol后面就是协议名

@protocol CompanyDelegate <NSObject>

//协议里面有一些协议条款(方法)

-(void)workHard;

@optional//表示可选,不强制实现,一个标示下面,直到碰到另一个标示之前都按照这个表示的规则,如果协议中没有写@optional,那么就默认为必选

-(void)salary;

-(void)wear;

@required//表示必选,必须实现

-(void)manner;

@end

@interface Company :
NSObject

@end

1.2声明一个Worker类,在类中遵守Company类中的协议

1.2.1、.h文件的写法

#import <Foundation/Foundation.h>

#import "Company.h"

@interface Worker :
NSObject<CompanyDelegate>//遵守协议名

@end

1.2.2、.m文件的写法

#import "Worker.h"

@implementation Worker

-(void)workHard

{

NSLog(@"朝九晚五,不怕中暑,就算吃苦");

}

-(void)manner

{

NSLog(@"请着正装");

}

@end

1.3AppDelegate.m文件的调用

Worker *pp = [Worker
alloc];

[pp workHard];

[pp manner];

2、设置协议方法二:直接创建协议文件

例:创建一个FindJobDelegate的协议文件

#import <Foundation/Foundation.h>

@protocol FindJobDelegate <NSObject>

-(void)studyHard;

@optional

-(void)findJob;

@end

三、代理

1、代理流程

当我们有一个类,想通过自己的一个方法影响另一个类的时候,我们可以选择用代理

一、触发类做一个协议,协议里有一些方法

二、触发类做一个属性,这个属性是遵守了协议的id属性

三、触发类有一个触发的方法,在这个触发方法中,用触发类自己的id属性调用协议中的方法

四、被触发类遵守触发类的协议

五、被触发类实现协议中的方法

六、被触发类实例化一个触发类的对象,并把自己self赋值给触发类的id属性

使用的时候

一、实例化一个被触发类的对象

二、用被触发类对象调用自己实例化触发类对象的方法,实现把自己给触发属性的功能

三、用触发对象调用触发方法,这个时候被触发对象,就会有相应的响应

2、具体事例

以boss和littleBrother为例

2.1、boss类中,.h文件的写法

#import <Foundation/Foundation.h>

@protocol BossDelegate <NSObject>

-(void)say:(NSString *)whatISay;//给协议的方法加上参数

@end

@interface Boss :
NSObject

@property(nonatomic,assign)id<BossDelegate>delegate;//触发者的一个属性

-(void)beat:(NSString *)whatYouSay;//触发者的触发方法也要有参数,这个参数在调用的时候由我们自己来写

@end

2.2、boss类中,.m文件的写法

#import "Boss.h"

@implementation Boss

-(void)beat:(NSString *)whatYouSay

{//这个是触发者的触发事件

[self.delegate
say:whatYouSay];

}

@end

2.3、littleBrother类中,.h文件的写法

#import <Foundation/Foundation.h>

#import "Boss.h"

@interface LittleBrother :
NSObject<BossDelegate>

@property(nonatomic,retain)Boss *bigBoss;//触发者的一个对象,建在了被触发这个类里

-(void)findBoss;

@end

2.4、littleBrother类中,.m文件的写法

#import "LittleBrother.h"

@implementation LittleBrother

-(void)say:(NSString *)whatISay

{//被触发后会自动调用这个方法

NSLog(@"%@",whatISay);

}

-(void)findBoss

{//实例化一个触发者的对象

self.bigBoss = [Boss
alloc];

self.bigBoss.delegate
= self;//被触发者把自己给了触发者的那个协议属性

[self.boss
release];???

}

-(void)dealloc

{

self.boss =
nil;

[super dealloc];

}

@end

2.5、AppDelegate.m文件的写法

LittleBrother *littleBrother = [LittleBrother
alloc];

//做一个被触发者对象

[littleBrother
findBoss];//在这个里面,实例化了一个触发者的对象,并把被触发者自己给了触发者的一个属性

NSArray *arr =
@[@"爽",@"再来",@"不错",@"打右脸",@"我错了",@"爽爆了"];

for (int i=0; i<20; i++) {

sleep(2);

NSLog(@"这次老大让说:%@",arr[arc4random()%6]);

[littleBrother.bigBoss
beat:arr[arc4random()%6]];//触发者触发事件,在这个事件中,用触发者的属性调用协议方法,因为触发者的属性就等于被触发者的对象,所以就相当于用被触发者的对象去调用了这个协议方法,因此被触发者的协议方法就被调用了

}

3、基于上例所提关于代理的问题

1、触发者是谁:boss

2、被触发者是谁:littlebother

3、协议在哪里?触发者boss .h文件中

4、boss有一个什么属性?遵守了协议的id类型属性

5、boss除了协议属性,还有一个触发方法,在触发方法里干什么了?用自己的协议属性调用了协议的方法

6、little brother遵守了什么了?遵守了boss的协议

7、little brother遵守协议之后实现了协议中的方法(say)

8、实例化了一个boss的对象,然后干啥了?将little brother自身赋值给boss的协议属性

9、因为有了第8步,所以第5步时,boss用自己属性调用方法时,相当于littebrother在调用方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: