OC 07 类的扩展
1.NSDate的使用
NSDate是Cocoa中⽤于处理⽇期和时间的基础类,封装了某⼀给定的时刻(含日期,时间,时区)
注意NSLog(@“%@”,nowDate);⽆论你是哪个时区的时间,打印时总是打印对应的0时区时间。
2.NSTimelnterval
NSTimelnterval(即double类型)
常用方法:
可以使用-initWithTimeIntervalSinceNow:方法传⼊一个NSTimeInterval参数,创建一个 NSDate对象
// NSDate: 处理时间的类
//1.创建NSDate对象
// + (instancetype)date;
NSDate *nowDate =[NSDate date];
NSLog(@"%@",nowDate); //NSTimeInterval 间隔时间秒数 double类型
//创建明天现在的时间
// - (instancetype)initWithTimeIntervalSinceNow:(NSTimeInterval)secs;
NSDate *tomorrowDate = [[ NSDate alloc]initWithTimeIntervalSinceNow:*];
NSLog(@"%@",tomorrowDate);
//创建昨天现在的时间
NSDate *yesterdayDate = [[ NSDate alloc]initWithTimeIntervalSinceNow:-*];
NSLog(@"%@",yesterdayDate);
//取两个时间对象的间隔
// - (NSTimeInterval)timeIntervalSinceDate:(NSDate *)anotherDate;
NSTimeInterval time1 = [ tomorrowDate timeIntervalSinceDate:yesterdayDate]/;
NSLog(@"%.0f",time1);
//练习
// + (instancetype)dateWithTimeIntervalSinceNow:(NSTimeInterval)secs;
NSDate *datetime2 = [ NSDate dateWithTimeIntervalSinceNow: * ];
// - (NSTimeInterval)timeIntervalSinceNow;
NSTimeInterval time2 = [ datetime2 timeIntervalSinceNow];
if (time2 < ) {
NSLog(@"刚刚");
}else if (time2 > && time2 < ){
NSLog(@"%.f前",time2/);
}else if (time2 > ){
NSLog(@"%.0f小时前",time2/);
}
3.NSDateFormatter
NSDateFormatter是iOS中的⽇日期格式类,功能是实现NSString和NSDate的互
转。
常⻅见的时间格式化字符串有以下⼀一些:y 年、 M 年中的⽉月份 、d ⽉月份中的天 数、 H ⼀一天中的⼩小时数(0-23)、 h am/pm 中的⼩小时数(1-12)、m ⼩小时中的分钟 数 、s 分钟中的秒数 等
指定⽇日期格式: NSDateFormatter * formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
//创建日期时间格式化类NSDateFormatter
//设置时间格式化样式
NSDateFormatter *dateFormatter = [[ NSDateFormatter alloc]init];
// - (void)setDateFormat:(NSString *)string;
[dateFormatter setDateFormat:@"yyyy年MM月dd日 HH时mm分ss秒"]; // - (NSString *)stringFromDate:(NSDate *)date;
NSString *timestr =[ dateFormatter stringFromDate:[NSDate date]];
NSLog(@"%@",timestr);
// 将字符串@“2014年05⽉01⽇ 10点23分18秒”转换为NSDate对象。
// @"2014年11月21日 11时42分49秒" 格式必须相同
NSString *timestring = @"2014年11月21日 11时42分49秒";
// - (NSDate *)dateFromString:(NSString *)string;
NSDate *datetimer = [ dateFormatter dateFromString:timestring];
NSLog(@"datefromString:%@",datetimer);
4.Category
Category也叫分类或类⽬
主要作⽤是为没有源代码的类添加方法。
通过Category添加的⽅法会成为原类的⼀部分。从⽽达到扩展⼀个类的功能。
如何定义Category



.h里添加方法声明
#import <Foundation/Foundation.h>
// @inteface 后面紧跟的类名表示的是你要给哪个类扩充方法
// (Hi) : 它中hi表示的时当前类目的名字
@interface NSString (Hi) + (void)sayHi;
@end
.m添加方法实现
@implementation NSString (Hi) + (void)sayHi
{
NSLog(@"hai");
}
@end
5.Extension
Extension的主要作用是管理类的“私有”方法。面向对象编程也叫⾯面向接⼝编程。
在设计⼀个类的时候,有些方法需要对外公开(我们称为接口), 有些方法仅内部使用(⽐如:是某个方法的一个小步骤)。
Extension的功能是帮我们去管理这些内部使用的方法(“私有”方法)。
Extension的语法格式和Category很相似 相当于把Category的.h⽂文件挪到了原始类的.m⽂件中 Extension针对的是自⼰己的类,必须有源代码的类
如何定义Extension?
xxx.m⽂文件
@interface xxx (ExtensionName)
//你的方法列表
@end
@implementation xxx
//方法的实现
@end
#import "Person.h" //延展 Extension
@interface Person () - (void)introduceSelf; @end @implementation Person - (void)introduceSelf
{
NSLog(@"hello");
}
@end
Category与Extension的区别

6.Protocol(协议),是iOS开发中常⽤用的技术。
协议是一套标准(一堆⽅法的声明),只有.h文件。就像一张任务清单(或便利贴),上面写了一堆需要处理的事。清单交给谁,谁就要去完成清单上规定的任务。
接受协议的对象实现协议中定义的⽅法。即:清单交给谁,谁就要去完成清单上规定的任务。
@protocol开始,以@end结束,例如:
@protocol MarryProtocol <NSObject>
- (void)makeMoney;
@optional
- (void)washcloth;
- (void)cook;
@end
协议中的⽅法默认是必须实现的,即@required。 关键字 @optional 修饰的方法是可选的,可实现也可不实现。
遵守协议分两步
1、在类的.h文件 父类名后写上<协议名>。
2、在.m文件中实现协议中的方法。相当于给这个类添加了若干个方法。这个类的实例就可以调用这些方法.
如何遵守协议?
#import “MarryProtocol”
@interface Boy : NSObject <MarryProtocl>
...
@end
@implementation Boy
//协议中⽅法的实现
@end
delegate
Protocol的核⼼使用场景是实现delegate设计模式。
delegate(代理)。通俗的讲就是代理商,主要的任务是帮你完成一些任务。
比如:保姆就可以认为是delegate,主要的任务是帮你带孩子、 做饭、洗衣服等。
使⽤场景:凡是某些任务⾃⼰不去实现,想让别人去实现的时候, 就可以指定⼀个代理,让代理帮你去做。你只需要通知代理去做某事。





OC 07 类的扩展的更多相关文章
- OC基础:类的扩展.协议 分类: ios学习 OC 2015-06-22 19:22 34人阅读 评论(0) 收藏
//再设计一个类的时候,有些方法需要对外公开(接口),有些仅供内部使用. 类的扩展:为类添加新的特征(属性)或者方法 对已知类: 1.直接添加 2.继承(在其子类中添加实例变量和方法) 3.使用ext ...
- OC: 类的扩展、类的延展、协议、 NSDate
NSDateFormatter 指定⽇日期格式: NSDateFormatter * formatter = [[NSDateFormatter alloc] init]; [formatter ...
- OC分类(类目/类别) 和 类扩展 - 全解析
OC分类(类目/类别) 和 类扩展 - 全解析 具体见: oschina -> MyDemo -> 011.FoundationLog-OC分类剖析 http://blog.csdn. ...
- OC中类别、扩展、协议与委托
一.类别(category) 类别(category)——通过使用类别,我们可以动态地为现有的类添加新方法,而且可以将类定义模块化地分不到多个相关文件中.通常只在类别中定义方法.(类别,接口部分的定义 ...
- Java虚拟机JVM学习07 类的卸载机制
Java虚拟机JVM学习07 类的卸载机制 类的生命周期 当Sample类被加载.连接和初始化后,它的生命周期就开始了. 当代表Sample类的Class对象不再被引用,即不可触及时,Class对象就 ...
- IOS基础之 (十二) 类的扩展
对OC类的扩展总结如下,共有4个: 1.子类 subClass 作用:可以使用类的继承来增添父类的变量和方法. 写法:在.h文件中 @interface Student : Person 2.分类 C ...
- OC中类别、扩展、协议与托付
类别(category)--通过使用类别,我们能够动态地为现有的类加入新方法.并且能够将类定义模块化地分不到多个相关文件里.通常仅仅在类别中定义方法. 类别,接口部分的定义,通常该文件命名为已有&qu ...
- JavaScript学习总结(十四)——JavaScript编写类的扩展方法
在JavaScript中可以使用类的prototype属性来扩展类的属性和方法,在实际开发当中,当JavaScript内置的那些类所提供的动态 ...
- C++类功能扩展预留五招
第一招虚函数 通过派生类来进行功能扩展是基本的面向对象的方式,这种方式大如下: class base { public: virtual ~base(){} virtual void fun() { ...
随机推荐
- hdu 2768 Cat vs. Dog (二分匹配)
Cat vs. Dog Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- 事件驱动与异步IO--待更新
论事件驱动与异步IO 通常,我们写服务器处理模型的程序时,有以下几种模型: (1)每收到一个请求,创建一个新的进程,来处理该请求: (2)每收到一个请求,创建一个新的线程,来处理该请求: (3)每收到 ...
- 生成模型(Generative Model)Vs 判别模型(Discriminative Model)
概率图分为有向图(bayesian network)与无向图(markov random filed).在概率图上可以建立生成模型或判别模型.有向图多为生成模型,无向图多为判别模型. 判别模型(D ...
- hadoop 使用Avro求最大值
在上例中:hadoop MapReduce辅助排序解析,为了求每年的最大数据使用了mapreduce辅助排序的方法. 本例中介绍利用Avro这个序列化框架的mapreduce功能来实现求取最大值.Av ...
- [LOJ#2542] [PKUWC2018] 随机游走
题目描述 给定一棵 n 个结点的树,你从点 x 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 Q 次询问,每次询问给定一个集合 S,求如果从 x 出发一直随机游走,直到点集 S 中所有点都 ...
- [HNOI2012]排队 组合数
公式:A(n,n)*A(n+1,2)*A(n+3,m) + A(n,n)*C(m,1)*A(2,2)*C(n+1,1)*A(n+2,m-1) 分情况讨论推出公式 前者为无论何时都合法的,后者为先不合法 ...
- poj3207 Ikki's Story IV - Panda's Trick 2-sat问题
---题面--- 题意:给定一个圈,m条边(给定),边可以通过外面连,也可以通过里面连,问连完这m条边后,是否可以做到边两两不相交 题解: 将连里面和连外面分别当做一种决策(即每条边都是决策点), 如 ...
- UVA.136 Ugly Numbers (优先队列)
UVA.136 Ugly Numbers (优先队列) 题意分析 如果一个数字是2,3,5的倍数,那么他就叫做丑数,规定1也是丑数,现在求解第1500个丑数是多少. 既然某数字2,3,5倍均是丑数,且 ...
- 2015/9/19 Python基础(15):变量作用域及生成器
变量作用域标识符的作用域是定义为其声明的可应用范围,或者即是我们所说的变量可见性.也就是,我们可以在程序的那个部分去访问一个制定的标识符.全局变量与局部变量定义在函数内的变量有局部作用域,在一个模块中 ...
- asp.net 文件上传,大文件上传。
新建一个asp.net页面,在工具栏里拖入 FileUpload 上传控件.一个按钮 Button ! ! ! 进入Button事件 //----------------------- ...