【Lession 13 OC语言】- protocol
本节目录
protocol理解
protocol是协议的意思,可以理解成定义规则,就是你必须跟着我的规则走,否则不是乱套了对吧。
protocol案例
我们添加一个Button类,声明一个Button监听的协议,然后用户通过这个协议来实现按钮监听
Button.h
#import <Foundation/Foundation.h> //声明一个代理,后面才定义 @protocol ButtonDelegate; @interface Button : NSObject //按钮的点击方法 -(void)click; //代理就是监听器,当用户点击时通过代理通知用户 @property(nonatomic,assign)id<ButtonDelegate> delegate; @end //按钮代理方法 @protocol ButtonDelegate <NSObject> //@optional; -(void)onClick:(Button *)btn; @end
Button.m
#import "Button.h" @implementation Button -(void)click{ //通过代理通知用户点击 if ([_delegate respondsToSelector:@selector(onClick:)]) { [_delegate onClick:self]; } } @end
MyButtonListener.h
#import <Foundation/Foundation.h> #import "Button.h" @interface MyButtonListener : NSObject<ButtonDelegate> @end
MyButtonListener.m
#import "MyButtonListener.h" @implementation MyButtonListener -(void)onClick:(Button *)btn{ NSLog(@"MyButtonListener 监听到按钮的点击事件了"); } @end
main.m
#import <Foundation/Foundation.h> #import "Button.h" #import "MyButtonListener.h" int main(int argc, const char * argv[]) { @autoreleasepool { //声明一个按钮 Button *btn = [[[Button alloc] init] autorelease]; //声明一个按钮的监听事件,这个监听是遵循了ButtonDelegate协议的 MyButtonListener *listener = [[[MyButtonListener alloc] init] autorelease]; //给按钮设置监听 btn.delegate = listener; [btn click];//模拟屏幕点击 } return 0; }
注:
>protocol的声明协议必须遵循<NSObject>协议
>在property中用id<代理>,变量名不用加*
>声明代理方法使用@optional修饰时,表示遵循该代理类可以不实现代理的方法。