首页 > 代码库 > OC基础-protocol

OC基础-protocol

protocol(协议)的声明看起来比较向java中得一个类的接口,但是不同点在于:protocol没有父类也不能定义实例变量.

protocol是一种特殊的程序设计结构,用于声明专门被别的类实现的方法.

常见使用场合:

1.需要由别的类来实现的方法

2.声明未知类的接口

3.两个类之间的通信

protocol的基本特点:

   协议可以被任何类实现的方法

   协议本身不是类,他是定义了一个其他类可以实现的接口.

   类别也可以采用协议(用得不多)

protocol中得关键字:

@required :表示必须强制实现的方法

@optional :表示可以选择实现的方法

 

//协议的声明#import @protocol OneProtocol //可以选择实现的方法:@optional-(void) optionalMethod1;-(void) optionalMethod2;//必须实现的方法:@required-(void) requiredMethod1;@end

 

示例:模拟一个按钮被点击的情形

// Button.h文件

#import <Foundation/Foundation.h>

// 潜规则:一般来说我们写一个协议通过称它为代理(delegate)

// <>代表是实现某一个协议

@protocol ButtonDelegate <NSObject>

- (void)onClick;

@end

@interface Button :NSobject

//设置按钮Button的监听器delegate

@prooerty (nonatomic ,retain)id<ButtonDelegte>delegate;   //实例变量delegate必须是继承了ButtonDelegate协议的对象才可以成为button的监听器.

//设置一个click函数用来模拟button被点击了

- (void)click;

@end

 

// Button.m文件

 

#import "Button.h"

@implementation Button

-(void)click

{

// 当Button被点击时就通知监听器

[_delegate onClick];

}

@end

 

//创建Button的监听器类,用于监听按钮被点击的事件

//ButtonListener,h文件

#import <Foundation/Foundation.h>

#import "Button.h"

// ButtonListener继承了Button的Buttondelegate协议,必须实现该协议的方法onClick

// Buttonlistener 继承了Buttondelegate协议后,具有了监听Button被点击后的反应功能

@interface ButtonListener :NSObject<ButtonDelegate>

@end

 

//ButtonListener.m文件

#import "ButtonListener.h"

@implementation ButtonListener

-(void)onClick

{

NSLog(@"按钮被点击了!");

}

@end

 

写法二:

[

 #import <Foundation/Foundation.h>

 //在此处不整体导入Button.h文件,对协议进行提前声明,跟@class的用途一致

@protocol ButtonDelegate;  

 // ButtonListener继承了Button的Buttondelegate协议,必须实现该协议的方法onClick

 // Buttonlistener 继承了Buttondelegate协议后,具有了监听Button被点击后的反应功能

 @interface ButtonListener :NSObject<ButtonDelegate>

 @end

 

//ButtonListener.m文件

#import "ButtonListener.h"

//在.m文件中导入Button.h文件,用于导入Button.h文件的所有内容,提供协议中得onClick 方法信息.

//方法二种的@protocol的使用参照@class来理解.两者效果和作用一样.

#import "Button.h"

@implementation ButtonListener

-(void)onClick

{

NSLog(@"按钮被点击了!");

}

@end

 ]

 

main 函数中的调用:

// 初始化一个按钮

Button *button=[[button alloc]init];

//初始化一个监听器

ButtonListener *listener=[[ButtonListener alloc]init];

//设置按钮的监听器

button.delegate=listener;

[button click];  //触发按钮监听器执行Onclick方法;

 

 

//补充完善:上面的onClick虽然可以被多个button对象同时调用,但是并不能区分是谁调用的该函数,所以用以下方法来完善程序.

协议中声明onClick时使用:  -(void)onClick:(Button *)btn

在ButtonListener.m中实现时使用如下方式:

-(void)onClick:(Button *)btn

{

NSLog(@"%@按钮被点击了!",btn);

}

//Button中click的实现方式

-(void)click

{

//如果_delegate监听器实现了onClick:方法就执行该方法

//OC中用一种 [对象名 resondsToSelector:@selector(方法名)] 机制来判断某一个函数是否被实现

if([_delegate resondsToSelector:@selector(onClick:)])

{

[_delegate onClick:self];

}else{

//如果监听器没有实现onClick方法就通知出来

NSLog(@"监听器并没有实现onClick:方法");

}

}

 

有关protocol的小知识点:

1.一般protocol放在一个单度的文件中,command+N来快速创建该文件

2.在.h中通常使用  @protocol 协议名; 来声明协议,而不是用#import来整体导入protocol ,在使用的时候才用#import来导入协议.(与@class相同)

3.@protocol声明方式: @protocol 协议名1,协议名2....   继承时用: <协议名1,协议名2,....>

4.判断某个对象是否遵循某一个协议的方法:BOOL [对象名 conformsToProtocol:@protocol(协议名)]

file:///Users/lanou3g/Desktop/96BA22BB-CFA6-482B-9B93-D722CEF1E840.png