Protocol

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