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:表示可以有选择性的实现方法
具体用法:
举个例子,我们现在有一个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
相关文章推荐
- Object-C 协议 Protocol
- swift protocol 协议代理的使用以及解决循环引用问题
- Object-C中的协议Protocol
- 黑马程序员__protocol协议在代理模式中的使用
- protocol 和delegate(协议和代理)的区别
- 浅谈iOS开发的协议(protocol)和代理(delegate)
- objective-c 协议(Protocol)和代理(Delegate)
- object—c 代理 协议 委托 数据源 概念
- object-c-协议-protocol
- iOS 开发-Objective-c基础:协议和代理delegate&protocol)
- object—c 代理 协议 委托 数据源 概念
- object-c中的协议@protocol/@required问题
- object-c 协议(Protocols)和代理(Delegation)的学习
- 黑马程序员--Protocol 代理协议
- [置顶] Objective-C ,ios,iphone开发基础:protocol 协议(委托,代理)的声明
- Protocol and Delegate协议和代理
- oc中的protocol(协议)与delegate(代理)
- Object-C 协议@protocol
- object-c学习:协议protocol
- Protocol and Delegate 协议和代理(设计模式之代理模式)