协议其作用类似于接口,用于定义多个类都应该遵守的规范,协议不提供实现一般由类来完成;
1. 使用类别 Category
实现非正式协议
这是一种以NSObject为基础,为NSObjcet创建类别,创建类别时即可指定该类别新增的方法。
当某个类或者子类中实现该NSObject的类别时,就可以直接使用实现该类别下的拥有的方法。
如: NSObject+Entable.h 有NSobject的Entable的类别中定义类一个 test 方法
@interface NSObject(Entable)
-(void)test;
@end
Test.h 继承于NSObject
@interface Test:NSObject
@end
Test.m
@implementle Test
//下面语句的方法就是继承于父类的非正式协议的 test 方法;
-(void)test{
NSLog(@"口感很好!");
}
@end
>>>
还可用于扩展某个常用类或者自定义类使用:
如 UIColor+Hex.h/UIColor+Hex.m
是对于 `UIColor` 类的常用方法扩展,只需要导入头文件即可直接使用 `UIColor` 扩展类的相关方法。
2.正式协议的定义
正式协议使用@protocol关键字
基本语法格式如下:
@protocol 协议名<父协议1,父协议2....>//协议只能继承协议不能继承类;如@protocol UIPickerViewSource<NSObject>是实现NSobject这个父类协议。
{
多个方法定义.....//定义的方法只有方法签名没有方法实现,方法既可以是类方法也可以是实例方法;
}
@end
为了弥补正式协议必须实现协议中定义的所有方法造成的灵活性不足,新增加两个关键字@optional和@required,一个是定义的方法是可以选择实现的,一个是必须实现的方法。
>>>
这种正式协议也是 `delegate` 代理模式的模型
不论在非正式协议中还是在正式协议中,当一个类在实现一个协议时.如果在非正式协议中继承的类没有实现协议方法并且非正式协议本身也没有实现该方法,则在最后运行程序就会引起-unrecognized selector sent to instance...-错误;
若在正式协议中是被 @required
关键字修饰的则在实现协议的类中必须实现这个方法,否则在运行程序时会出现 -unrecognized selecotr sent to instance...
-错误
网友评论