簡單來講就是一系列方法的列表,其中聲明的方法能夠被任何類實現。這種模式通常稱爲代理(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)];