一、类目Category
*怎样为类添加一个方法:
- 修改源代码
- 编写此类的子类
*OC中常见的扩展方式:
- 类目Category、延展Extension、协议Protocol
1、介绍:
- 类目可以为一个现有的类添加新的方法
- 类目与原类同级,是原始类的一部分,方法也同级
- 类的类目新增的方法可以它的子类继承
2、注意事项
- 类目中只能写方法,不能添加成员变量
- 同一个类可以添加多个类目,但不能重名
- 可以覆写现有类的方法,原方法不能被调用
3、类目的创建
- command + N >> OS X 中 Objective-C File >> File Type 选择 类目Category。
4、多重类目
- 多重类目不要重写一个方法,如果重写了同一个方法,那么系统只调用重写后 方便调用的那个方法。
5、类目中方法的创建,和类中一样。只是没有实例变量(属性)
二、延展Extension
*、介绍
- 在类的实现文件中定义的类目,叫做延展
- 延展是匿名的类目,定义“私有”的方法
- @interface 延展名 () //小括号里可写可不写
- @end
- 主要用来介绍 当前文件内哪些是闭源的 (闭源就是不访问,“私有的”,只有实现没有声明的)
- 写在 .m 文件中,需要遵循 OC 书写规则。而 单独创建的的延展.h文件 没有语法检查
三、协议Protocol
1、概述
- 协议声明了可被其他的类实现的方法
- 协议不是类,只是一个其他类实现的接口
2、协议的创建与签订
- @protocol 协议名 <必须遵守的协议> ————(协议名称必须唯一)
- @protocol Protocol <NSObject>
- @required (默认类型) 放在方法声明前面,用来修饰必须实现的方法 。
- @optional 可以选择实现的方法
- @end (结束)
3、协议的采用: 必须将协议的头文件 导入需要实现方法的目标类的头文件内,并<留名> 签订
- Tiger 采用 ZooRule协议
- #import"ZooRule.h"
@interface Tiger :NSObject <ZooRule> //签订协议<协议名>
- #import"ZooRule.h"
- 假如Tiger类 要同时采用两个协议
- @interface Tiger :NSObject <ZooRule,ManagerRule>
-
- 在协议中声明的方法,在类的 .h文件中就没必要再声明了。
- 在实现文件文件中用 下列标记,方便程序的阅读与修改
- 加注释方法:
- #pragma mark -协议中@required
- #pragma mark -协议中@optional
3、协议的作用
- 协议写有达到某种功能所有需要的方法,而每个类可能只需要实现其中少数的几条方法。只有全部实现才能获得一系列的有用功能
4、协议和数据类型
- 你可以在使用的数据类型中为实例变量和方法参数指定协议名称;
- 如:id 类型表示一个可以指向任何类型的对象的指针,它是泛指对象类型。如果用一个尖括号<>括起来的协议名称跟随在id 之后,则编译器(或读者)将知道你期望任意类型的对象,只要遵守该协议。id<Delegate> _argent;
四、计数器的使用
1、TimerInterval:时间戳,每隔几秒调用一次。double 类型数据
2、target:调用方法的对象
3、selector:需要被调用的方法
4、userInfo:id 类型的用户信息,用以区分,在KVO会详细讲。可使用 nil
5、repeats:是否重复: YES /NO
- [NSTimerscheduledTimerWithTimeInterval:2
- target:self
- selector:@selector(test:)
- userInfo:@“Hello"
- repeats:YES];
- - (void)test:(NSTimer *)timer {
- id userInfo = timer.userInfo; //接收userInfo 信息
- [timerinvalidate]; //终止定时器
- }
6、让程序读到此处停下,但还在运行,直到某一个时间,再继续往下运行
- NSDate *date = [NSDatedateWithTimeIntervalSinceNow:10];
- [[NSRunLoopcurrentRunLoop]runUntilDate:date];
7、让程序一直运行在此处逗留
- // [[NSRunLoop currentRunLoop]run];