您的位置:首页 > 移动开发 > Objective-C

Object-C中的代理协议Protocol

2015-03-20 22:05 288 查看
在OC中的代理协议Protocol和java中的接口有点像,在java中一个类如果实现一个接口,那么该类必须实现该接口中的方法,而在OC中,类似接口的功能是有代理协议Protocol来实现的,协议中定义的方法,实现协议的类不一定要实现代理协议中的方法,可以选择性的实现。

举个例子,我们现在有一个Button按钮类,我们点击该按钮后需要对该点击事件作出反应并且处理。在android中我们可以使用实现OnClickLinsener这个接口来完成对各种view点击事件的监听,他的一个机制大概是系统底层对点击屏幕电容变化监听来判断是否点击----》信息返回android系统---》系统通过一层接口通知。这个机制就相当于我们要模拟的场景,我们如何在oc中自己写一个类似java中的接口来实现对button的监听呢?

首先,我们在xcode新建一个Button类:

@class Button;

//定义一个协议,按钮点击协议

@protocol ButtonDeletage <NSObject>

-(void)ButtonOnclick:(Button*)view;

@end

@interface Button : NSObject

@property (nonatomic,retain) id<ButtonDeletage> deletage;

//在Button模拟点击按钮

-(void)onclick;

@end

以上代码定义了一个protocol,容易看出协议定义的方式: @protocol 协议名称 <协议实现> ...方法... @end ,其中的<>:表示oc中的实现某个类,什么对象都可以被当成是代理对象,所以这里就直接实现NSObject,在看以上代码的方法体,和平时自己定义的普通方法一样的。

然后在Button里面有那么一个属性--代理属性(因为button需要实现我们的代理协议)该属性和平常定义的稍微有点区别,在于id<ButtonDeletage> deletage ,id表示对象,该对象需要按照那个协议来通信<ButtonDeletage> ,然后deletage表示属性名称。

然后,我们在写一个监听类 ButtonClicklinsener:

@protocol ButtonDeletage;

@interface ButtonClicklinsener : NSObject <ButtonDeletage>

@end

我们在监听类的头文件中实现该代理<ButtonDeletage>,注意在这里@protocol ButtonDeletage这一句的作用是声明一个代理。

在监听类的实现类中我们实现代理:

#import "Button.h"

@implementation ButtonClicklinsener

-(void)ButtonOnclick:(Button *)view{

NSLog(@"%@被点击了!",view);

}

@end

这里因为需要用到代理的方法,所以需要import ,而不能在使用声明(声明只表示告诉当前类,我已经有这个Button类了,别给我报找不到这个类的错,而import表示copy)

最后我们在Main中调用:

Button *btn=[[Button alloc] init]; //创建Button对象

ButtonClicklinsener *linsener=[[ButtonClicklinsener alloc] init]; //创建按钮监听对象

btn.deletage=linsener; //把创建好的监听对象给button

[btn onclick]; //模拟调用buuton的click点击事件

拓展:

协议中的关键字

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

@optional:表示可以有选择性的实现方法
具体用法:

@protocol OneProtocol 
      //可以选择实现的方法:
      @optional
       -(void) optionalMethod1;
       -(void) optionalMethod2;
     //必须实现的方法:
      @required
       -(void) requiredMethod1;
  @end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: