OC基础-protocol
protocol(协议)的声明看起来比较向java中得一个类的接口,但是不同点在于:protocol没有父类也不能定义实例变量.
protocol是一种特殊的程序设计结构,用于声明专门被别的类实现的方法.
常见使用场合:
1.需要由别的类来实现的方法
2.声明未知类的接口
3.两个类之间的通信
protocol的基本特点:
协议可以被任何类实现的方法
协议本身不是类,他是定义了一个其他类可以实现的接口.
类别也可以采用协议(用得不多)
protocol中得关键字:
@required :表示必须强制实现的方法,默认的
@optional :表示可以选择实现的方法
但是系统在编译时如果required修饰方法没有实现也不会报错,他只是字面的要求而已.
//协议的声明 #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中用一种 BOOL [对象名 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(协议名)]