简单来讲就是一系列方法的列表,其中声明的方法能够被任何类实现。这种模式通常称为代理(delegation)模式框架
在iOS和OS X开发中,Apple采用了大量的代理模式来实现MVC中View(UI控件)和Controller(控制器)的解耦ui
1、Protocol的定义spa
在声明文件(MyBtnDelegate.h文件)中定义代理
#import <Foundation/Foundation.h> @class MyBtn; @protocol MyBtnDelegate <NSObject> @required - (void) btnClick: (MyBtn *)sender; @optional - (void) btnInit: (MyBtn *)sender; @end
以上代码能够单独放在一个h文件中,也能够写在相关类的h文件中,视具体状况而定code
该Protocol包含两个方法,btnClick:和btnInit:orm
这里还有两个关键字,@required和@optional,表示若是要实现这个协议,那么btnClick:方法是必需要实现的,btnInit:则是可选的,这两个关键字是在OC 2.0以后加入的语法特性。若是不注明,那么方法默认是@required的,必须实现blog
MyBtnDelegate是Protocol的名称继承
<NSObject>表明这个Protocol实现了NSObject协议接口
2、Protocol的实现事件
建立一个普通OC类,在h文件中引入包含Protocol的h文件(或者用@protocol声明这个协议,做用跟@class相似, 建议用这种方式)
// #import "MyBtnDelegate.h" @protocol MyBtnDelegate; @interface MyController : NSObject<MyBtnDelegate> @end
用<>括起来的MyBtnDelegate就是咱们建立的Protocol。若是要实现了多个Protocol,能够在尖括号内引入多个Protocol名称,并用逗号隔开便可。例如<MyBtnDelegate,xxxDelegate>
.m文件以下
#import "MyBtnDelegate.h" @implementation MyController - (void) btnClick: (MyBtn *)sender{ NSLog(@"按钮被点击了!"); } @end
因为btnInit:方法是可选的,能够只实现btnClick:
3、Protocol的使用场景
OC的Protocol和Java的接口很相似,若是一些类之间没有继承关系,可是又具有某些相同的行为,可以使用Protocol来描述它们的关系,不一样的类,能够实现同一个Protocol
最经常使用的就是委托代理模式,Cocoa框架中大量采用了这种模式实现数据和UI的分离。例如UIView产生的全部事件的处理,都是经过委托的方式交给UIViewController完成。根据约定,框架中后缀为Delegate的都是Protocol,如UIApplicationDelegate,UITableViewDelegate等
4、Protocol的注意
一个Protocol自己是能够实现其它Protocol
例如:
@protocol MyDelegate <UIWebViewDelegate> @end
可使用conformsToProtocol判断某个类是否实现了某个Protocol
例如:
[obj conformsToProtocol: @protocol(MyDelegate)];