类目:
允许为一个
已存在的类添加一些方法而不用子类化该类
,也不需要了解该类的实现细节。
(1)声明类目:@interface 已有的类(系统类、自定义类) (类目名)
1、该类目向已有类中添加方法,类目的名字由唯一性,同一个类的类目名不能重复,但可以给同一个类添加任意多个不同名的类目。
2、
不可以添加新的实例变量,类目的声明中没有实例变量。
(2)实现、使用类目
如果类目所在文件只有类目一个类,可以取名为:类名+类目名
类目具有最高优先级,即它会覆盖掉原来类中相同名字的方法。类目可以分散到不同的文件中,甚至不同框架中。
类目与非正式协议:对于NSObject的类目中所声明的方法,这个类可以不实现
NSObject的类目声明称为非正式协议,创建一个NSObject声明但不实现称为创建一个非正式协议。
-(BOOL)respondsToSelector:(SEL)aSelector;检查当前对象是否能够响应aSelector方法。
类目局限:1、只能添加方法,无法添加实例变量,可通过字典类型的参数解决 。2、类目中方法名和已有类方法名相同时,类目方法优先级高,类目方法会覆盖原来类中方法。
延展:(为已有类添加方法的时候可以变成私有的方法。/匿名的类目)
//隐藏方法和属性(将方法和属性声明到.m文件中,类内调用)
使用时机(私有API):如果私有方法的声明放入一个匿名类目中,并将类目放入一个.h文件中,这个.h文件可看做私有API。
协议
:非正式协议(@interface)正式协议(@protocol)
//控制进入系统的对象遵守协议(拥有协议声明的方法)内部协议需声明回调方法,前向声明
正式协议可以将业务中的方法剥离出来,形成一个单独的文件。采用正式协议时需要在声明类的时候说明要采用的协议
声明协议:关键字:@required必须实现方法@optional可实现可不实现
@protocol 协议名 <NSObject>
实现协议:@interface Classname:父类名<协议1,协议2..>
一个类可实现多个协议。
-(BOOL)conformsToProtocol:(Protocol *)aProtocol;
判断当前对象是否遵循aProtocol协议,当对象调用协议里的方法之前,最好判断一下是否遵循这个协议,否则找不到方法程序崩溃