1.继承是可以完成对类的扩充的,不仅能够添加方法也能添加实例变量;缺点:如果工程中有很多需要扩展类的使用,此时要用子类完成替换,工作量非常大时,还容易出错
2.使用Category 分类或者叫类目
主要作用:是为没有源代码的类添加方法,不能添加实例变量
添加分类的步骤:
(1)新建文件 comd + n
(2)选择 object - c file模块
(3)file栏根据扩展功能,写入文件名
(4)中间栏选择Category
(5)class选项写入对那个类的扩充,就写入那个类的类名
(6)next之后会自动生成一对 类名 + 扩展名.h 和 类名 +扩展名.m文件
(7)在.h文件中写入方法的声明
(8)在.m文件中写入方法的实现
3.使用Category添加的方法,是直接作用在当前的类上,可以使用当前类或者当前类创建的对象直接调用方法
Person *p1 = [[Person alloc]init];
[Person study];
[Person study];
调用分类中的方法
[p1 study];
4.如果分类中定义和原始类中一样的方法,此时优先选择执行分类中的方法;方法调用的优先级:分类
—》原来的类—》父类,若包含有多个分类,则最后参与编译的分类优先
//()代表是某个类的分类
//()中是内容的分类名
@interface Person (Study)
{
// NSString *_color;error!!!!!实例变量是不能定义在分类中
}
//分类不仅可以添加类方法也可以添加对象方法
//()中是内容的分类名
@interface Person (Study)
{
// NSString *_color;error!!!!!实例变量是不能定义在分类中
}
//分类不仅可以添加类方法也可以添加对象方法
5.Extension延展 主要用来管理一个类的私有方法
给一个类添加延展的步骤
(1)comd +n
(2)选择object - c file 模板
(3)第一个file栏写入延展名 prviate
(4)中间栏 选择 Extension
(5)class对那个类延展就写哪个类的类名
(6)此时只生成.h文件
(7)然后回到类的.m文件中写延展的实现,前提引入头文件
(8)注意:延展中可以添加实例变量,此时变量也是私有的
(9)延展针对的是能看到源文件的类
(10)延展可以不需要创建.h文件,直接写到类的.m中;建议以后写延展就使用这种方法;延展方便我们管理一个类的私有方法和实例变量
6.延展和分类的区别
(1)延展中可以添加实例变量,分类中不可以
(2)延展中的方法和实例变量都是私有的,外界不能访问,分类中的方法外界可以访问
(3)延展针对的是已知类(因为它的实现只能在这个类的.m文件中写),分类可以为不知道源文件的类添加方法
(4)延展中的内容子类不能继承,而分类中的内容子类可以直接使用
7.代理设计的由来:自己不想干,找别人干
代理设计模式的步骤:
(1)制定代理
(2)找代理
(3)遵循协议,成为代理
(4)执行协议中的方法
8.制定协议的步骤:
(1)comd + n
(2)文件名(类名 + delegate )eg:PersonDelegate
(3)中间栏 选择Protocol
(4)class哪个类制定的协议就写哪个类
(5)只生成.h文件
(6)谁成为代理就去谁的.m文件中写协议中的方法实现
9. //此时这个实例变量必须遵循协议<协议名称>
//遵循协议符号<协议名称>
//遵循协议符号<协议名称>
id<GirlDelegate> _boyFriend;
@required
//required修饰协议内容必须实现的
//required修饰协议内容必须实现的
@optional
//
可选择实现的
一个类要想成为代理必须遵循协议,遵循协议的位置写在父类的后面,使用一对尖括号<>即可
@interface Boy : NSObject <GirlDelegate>
@interface Boy : NSObject <GirlDelegate>
日期类
1.NSDate是一个日期类,继承自NSobject ,代表的是一个时间点
创建一个当前日期
NSDate *date =[NSDate date];
NSLog(@"%@",date);显示的是格林尼治时间,年月日 时分秒 +时区
typedef double NSTimeInterval; NSTimeInterval是double类型的
2. NSDate *date1 =[NSDate dateWithTimeIntervalSinceNow:60];
NSLog(@"%@",date1);
3.昨天的现在时刻
NSDate *yesterday = [NSDate dateWithTimeIntervalSinceNow:-24*60*60];
NSLog(@"%@",yesterday);
4.明年的今天就是你的忌日
NSDate *nextYear = [NSDate dateWithTimeIntervalSinceNow:365*24*60*60];
NSLog(@"%@",nextYear);
NSLog(@"%@",nextYear);
5.计算给定Date对象和当前时间的时间间隔
NSTimeInterval interval = [date1 timeIntervalSinceNow];
NSLog(@"%.2lf",interval);
6.计算当前时间和明年现在时刻的时间
interval = [date timeIntervalSinceDate:nextYear];
NSLog(@"%.2lf",interval);
7. //时间戳:从1970.1.1到当前时间的时间间隔,就叫时间戳
interval = [date timeIntervalSince1970];
interval = [date timeIntervalSince1970];
NSLog(@"%.2f",interval);
8.获取北京时间
在0时区的基础上加上8个小时,就到了东八区,也就是北京时间
NSDate *date5 = [date dateByAddingTimeInterval:8*60*60];
NSLog(@"%@",date5);
//计算一个当前时间和一个固定时间的差值,如果差值在60秒以内,则输出“刚刚”,如果在60秒到3600之间,输出XX分钟之前,如果在3600到24*3600之内,输出XX小时之前,如果是24*3600之外,则显示出固定时间日期
//创建固定时间对象
NSDate *dated6 = [NSDate dateWithTimeIntervalSinceNow:-36*3600];
//计算固定时间和当前时间的间隔
NSTimeInterval interval2 = [dated6 timeIntervalSinceNow];
//将负数转换为正数
// interval2 =(-interval2);
if (interval2 < 60) {
NSLog(@"刚刚");
}else if (interval2 < 3600){
NSLog(@"%.2f分钟之前",interval2/60);
}else if (interval2 < 24*3600){
NSLog(@"%.2f小时之前",interval2/3600);
}else{
NSLog(@"%@",dated6);
}
//创建固定时间对象
NSDate *dated6 = [NSDate dateWithTimeIntervalSinceNow:-36*3600];
//计算固定时间和当前时间的间隔
NSTimeInterval interval2 = [dated6 timeIntervalSinceNow];
//将负数转换为正数
// interval2 =(-interval2);
if (interval2 < 60) {
NSLog(@"刚刚");
}else if (interval2 < 3600){
NSLog(@"%.2f分钟之前",interval2/60);
}else if (interval2 < 24*3600){
NSLog(@"%.2f小时之前",interval2/3600);
}else{
NSLog(@"%@",dated6);
}
9.NSDateFormatter 日期格式类,继承NSFormatter,主要作用是将NADa特Formatter对象转换为某种格式,然后转换成NSString
(1)创建NSDateFormatter对象
NSDateFormatter *formatter =[[NSDateFormatter alloc]init];
(2)设定日期格式:y代表年,M代表月,d代表天,H代表小时,m代表分钟,s代表秒
[formatter setDateFormat:@"yyyy年MM月dd日 HH时mm分ss秒"];
NSDate *date7 = [NSDate date];
(3)stringFromDate会直接加入相距0时区的时间间隔
//NSDate ——》NSString
//stringFromDate会直接加上相聚0时区的时间间隔
NSString *dateString = [formatter stringFromDate:date7];
NSLog(@"%@",dateString);
//stringFromDate会直接加上相聚0时区的时间间隔
NSString *dateString = [formatter stringFromDate:date7];
NSLog(@"%@",dateString);
(4)将Date的显示格式变为:“2015年09月07号,11-25-20
//将Date7的显示格式变为:“2015年09月07号,11-35-20”
NSDateFormatter *mm2 = [[NSDateFormatter alloc]init];
[mm2 setDateFormat:@"yyyy年MM月dd号,HH-mm-ss"];
NSString *mm3 = [mm2 stringFromDate:date7];
NSDateFormatter *mm2 = [[NSDateFormatter alloc]init];
[mm2 setDateFormat:@"yyyy年MM月dd号,HH-mm-ss"];
NSString *mm3 = [mm2 stringFromDate:date7];
NSLog(@"%@",mm3);
(5)将字符串转换为NSDate对象
//eg:2015年09月07号 11时40分14秒
//准备时间格式对象
NSDateFormatter *formatter3 = [[NSDateFormatter alloc]init];
[formatter3 setDateFormat:@"yyyy年MM月dd号 HH时mm分ss秒"];
//准备字符串对象
NSString *dateString3 = @"2015年09月07号 11时40分14秒";
//将NSString ->NSDate
//准备时间格式对象
NSDateFormatter *formatter3 = [[NSDateFormatter alloc]init];
[formatter3 setDateFormat:@"yyyy年MM月dd号 HH时mm分ss秒"];
//准备字符串对象
NSString *dateString3 = @"2015年09月07号 11时40分14秒";
//将NSString ->NSDate
NSDate * date8 = [formatter3 dateFromString:dateString3];
(6)将转换回来的对象手动加上8小时,回到北京时间