主要内容:类的扩展
一、NSDate
NSDate是Cocoa中用于管理日期和时间的基础类,封装了某一给定的时刻(含日期、时间、时区)
使用+Date方法获取当前时间
示例:NSDate *nowDate = [ NSDate date ] ; / / 获得的是0时区的时间
NSLog (@" %@ " , nowDate) ; / / 无论是在哪个时区,打印获得的都是0时区的时间
NSTimelnterval (即double类型)用以表示以毫秒为单位的时间间隔
使用 initWithTimelntervalSinceNow : 方法传入一个NSTimelnterval参数,创建一个NSDate对象
示例: NSDate *tomorrowdate = [ [ NSDate alloc ] initWithTimelntervalSinceNow : 24 * 60 * 60 ] ;
NSLog(@"%@" , date) ; / / 打印获取第二天这个点的时间对象
NSDage *yesterdayDate = [ [ NSDate alloc ] initWithTimelntervalSinceNow : -1 * 60 * 60 ] ;
NSLog(@"%@" , yesterdayDate) ; / / 打印获取昨天这个点的时间对象
获取两个时间段的间隔
NSTimelnterval time = [ tomorrowDate timelntervalSinceDate : yesterdayDate ] ;
NSLog (@" %0f " , time) ; / / 打印获取两个时间段的间隔(以秒为单位,若要打印分或者小时,除以60或者3600即可)
二、NSDateFormatter的使用
NSDateFormatter是iOS中的日期格式类,功能是实现NSString和NSDate之间的互转
指定日期格式:
NSDateFormatter *formatter = [ [ NSDateFormatter alloc ] init ] ;
[ formatter setDateFormat : @"yyyy-MM-dd HH:mm:ss" ] ;
注意:指定日期格式时,里面的字母(y、M、d、H、m、s)不能改变,其他的任意改变,若H为小写时,则定义为12小时制(H为24小时制)
NSDate(时间) 转 NSString (字符串)
示例:时间转字符串(stringFromDate)
NSDateFormatter *formatter = [ [ NSDateFormatter alloc ] init ] ; / / 创建日期时间格式类
[ formatter setDateFormat : @"yyyy - MM - dd HH:mm:ss" ] ; / / 自定义时间格式
NSString *string = [ formatter stringFromDate : [ NSDate date ] ] ; / / 调用方法,定义一个字符串接收
NSLog(@"%@" , string ) ; / / 打印输出
时间字符串转换成对应的时间(dateFromString)
NSDateFormatter *formatter2 = [ ] NSDateFormatter alloc ] init ] ; / / 创建日期时间格式类
[ formatter setDateFormat : @"yyyy - MM - dd HH:mm:ss" ] ; / / 自定义时间格式
NSString *string = @"" ; / / 用字面量格式创建一个时间格式
NSDate *date = [ formatter2 dateFromString : string ] ; / / 调用函数,用一个时间对象接收
NSLog(@"%@" , date) ; / / 打印时间
注意:字符串的格式必须与自定义时间格式相同
三、类的扩展
Category(也叫分类或类目)
主要作用是:为没有源代码的类添加方法,通过Category添加的方法,会成为原类的一部分,从而达到扩展一个类的功能
创建Category的步骤:
新建文件 -> 选择Objective - C Category模板 -> 填写类名和分类名 -> . h文件添加文件声明 -> . m添加文件实现
创建之后是这个样式:
/ / 声明
@interface NSString (SayHi)
- (void) hi ;
@end
/ / 实现
@implementation NSString (sayHi)
- (void) hi
{
NSLog(@" Hi , body ") ;
}
@end
注意:1、@interface 后面紧跟的类名表示的是你要给哪个类扩充方法
2、(SayHi) 小括号里面的名字表示的是当前类目的名字
Category与子类的区别
Category | Subclass | |
功能 | 只能为类添加方法 | 既能为类添加方法,也能添加变量 |
特点 | 新添加的方法会成为原始类的一部分,能被子类继承 | 新添加的方法,只有子类有,父类不具有 |
使用 | 使用原始类的实例(如果是 -方法)或者原始类(如果是 +方法)调用方法 | 子类才能调用,如果在项目开发到尾声的时候,使用子类添加了方法,需要对已写代码做类型替换(将父类替换为子类) |
Extension
主要作用是:管理类的 “ 私有 ” 方法
面向对象编程也叫面向接口编程,在设计一个类的时候,有些方法需要对外公开(我们成为接口),有些方法仅仅内部使用
Extension的语法和Category很相似,相当于把Category的 .h 文
件挪到原始类的 .m 文件中
Extension针对的是自己的类,必须有源代码的类
Category | Extension | |
作用 | 为没有源代码的类添加方法 | 管理类的私有方法 |
格式 | 定义一对 .h 和 .m 文件 | 把代码写到原始类的 .m 文件中 |
四、协议、代理
Protocol(协议):iOS开发中常用的技术
协议是一套标准(一堆方法的声明),只有 .h 文件,就像一张任务清单,清单交给谁,谁就要完成上面的任务
接收协议的对象实现协议中的定义
如何定义Protocol(以@protocol开始@end结束)
示例
@protocol Marryprotocol <NSObject>
@required / / 必须遵循的方法
- ( void ) makeMoney ;
- ( void ) working ;
@optional / / 可以不实现的方法
- ( void ) wash ;
- ( void ) cook ;
@end
注意:1、协议中的方法默认是必须实现的 即 @required
2、关键字@optional修饰的方法是可选的,可实现可不实现
遵循协议分两步:
1、在类的 .h 文件父类名后面写上 <协议名>
2、在 .m 文件中实现协议中的方法
五、delegate设计模式(很重要,必须掌握)
Protocol(协议)使用的核心场景是实现delegate设计模式
通俗的讲就是:
自己不想做的,想让别人去实现的时候,就可以指定一个代理,让代理帮你做,你只需要通知代理去做某事