本文是用于学习笔记,原文来自于 http://blog.csdn.net/dong_007_007/article/details/7490419
着两个都是mac下的协议,用法有点像C++的函数重载和虚函数。
1、Category:
Category被称为"非正式协议(informal)",可以给原有的类增加新的方法,而不需要重新建一个类,然后在原有的类的基础上使用这个方法,但是不能给类增加新的数据成员。
eg: 给NSArray增加DeepCopy的方法
声明:
@interface NSArray(DeepCopy) -(NSArray* ) deepCopy; @end
实现:
@implementation NSArray(DeeepCopy) -(NSArray* ) deepCopy { //..... } @end
这样,我们可以在这个给NSArray增加协议的类中使用NSArray的新方法 deepCopy
NSArray* array = [[NSArray alloc] deepCopy];
可以给一个类中添加多个Category:
@interface NSArray(deepCopy_1) ... @end @interface NSArray(deepCopy_2) ... @end ......
每一个Category都有一个自己新增的方法,但是需要你自己去实现该方法的功能。
Category的使用原则:
1)不能增加数据成员
2)若Category添加的方法与原有的类的方法相同,则原有的方法将被覆盖。
2、protocol:
protocol被称为"正式协议(formal)",与Category不同的是,如果使用了一个protocol,就要实现该协议的所有方法(protocol的方法默认情况下都是申明为@required--必须实现,也可以申明为@optional--自定义的,可实现可不实现)。
protocol协议相当于C++中父类定义的纯虚函数,子类必须实现这些纯虚函数。但是protocol机制不需要继承,只需要声明某个协议,再实现它。
@protocol MouseHandleProtocol -(void)mouseDown:(int)id; //未申明类型,则默认为@required类型 @optional -(void)mouseDrag:(int)id; //申明为optional类型的,则可以选择实现,也可以不实现 ...... @end
而后在你的类中使用这个protocol
@interface pen:NSObject<MouseHandleProtocol> //申明使用MouseHandleProtocol协议 { ...... } ..... - (void)mouseDown:(int)id; //必须实现 - (void)mouseDrag:(int)id; @end
@implementation pen - (void)mouseDown:(int)id { ...... } ...... @end
protocol使用原则:
1).协议声明了可以被任何类实现的方法
2).协议不是类,它是定义了一个其他对象可以实现的接口
3).如果在某个类中实现了协议中的某个方法,也就是这个类实现了那个协议。
4).协议经常用来实现委托对象。一个委托对象是一种用来协同或者代表其他对象的特殊对象。
5).委托,就是调用自己定义方法,别的类来实现。
6).新特性说明
@optional预编译指令:表示可以选择实现的方法
@required预编译指令:表示必须强制实现的方法