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

来源:互联网 发布:万能数据恢复破解补丁 编辑:程序博客网 时间:2024/05/22 13:34

一、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 = [[NSDateFormatteralloc] init];//准备一个时间格式化对象,这个对象用来设置我们如何格式化一个时间

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

    [dateFormatter setDateStyle:NSDateFormatterLongStyle];

    [dateFormatter setTimeStyle:NSDateFormatterLongStyle];

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

    

    3.2自定义日期和时间格式

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

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

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

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

    

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

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

    

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

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

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

    

    5、日历

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

    NSDateComponents *com = [[NSDateComponentsalloc] 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 = [NSDatedateWithTimeIntervalSinceNow:96*60*60];

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

    NSLog(@"%d",[comweekday]);


二、协议


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


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 = [Workeralloc];

    [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.delegatesay: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 = [Bossalloc];

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

[self.bossrelease];???

}


-(void)dealloc

{

    self.boss =nil;

    [super dealloc];

}


@end


2.5、AppDelegate.m文件的写法

LittleBrother *littleBrother = [LittleBrotheralloc];

    //做一个被触发者对象

    

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

    

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

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

        sleep(2);

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

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

    }


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

1、触发者是谁:boss

2、被触发者是谁:littlebother

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

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

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

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

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

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

9、因为有了第8步,所以第5步时,boss用自己属性调用方法时,相当于littebrother在调用方法



0 0
原创粉丝点击