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)];
相关文章
相关标签/搜索