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在调用方法
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在调用方法
相关文章推荐
- OC语言笔记(七):OC字符串Json、plist、NSNumber和NSValue、KVC
- OC语言笔记(六):OC单例、NSData和文件操作
- OC语言笔记(五):OC封装和复合
- OC语言笔记(四):OC点语法、继承、类别
- OC语言笔记(三):OC数组和字典
- C语言 三级指针的应用
- OC语言笔记(二):OC字符串操作
- c++ 中Hello world的几种写法
- C++的XML编程经验――LIBXML2库使用指南
- OC语言笔记(一):OC程序解释
- C++ 浅层复制构造函数
- C语言笔记(八)
- 设计模式之策略模式(C++实现)
- C语言笔记(七)
- C语言笔记(六)
- 我的C++学习之路
- C++中字符串的库函数
- C语言笔记(五)
- C语言笔记(四)
- C语言笔记(三)