Protocol被用来定义一组独立于具体类的属性和方法,其不具体实现这些方法,任何类都可以实现Protocol,Protocol可以继承另一个Protocol,从特征上看Protocol的作用类似于Java世界的接口。
Protocol在具体的使用过程中基本上采用了“Delegation”模式,即采用Protocol定义方法,然后不同的类使用不同的具体实现,从而完成某个行为的多态。
1. 定义代理协议,满足协议可以触发onClick事件
@protocol ButtonDelegate <NSObject>
//点击按钮
//-(void)click;
@end
声明符合代理协议的监听器
@interface Button :NSObject
//delegate是按钮的监听器
//没有<ButtonDelegate>不用遵守任何协议任何协议
@property (nonatomic,retain)id<ButtonDelegate> delegate;
@end
2. 由于定义监听器有了retain,那么一定需要释放监听器内存
@implementation Button
-(void)dealloc{
[_delegaterelease];
[superdealloc];
}
3. 定义监听器
#import <Foundation/Foundation.h>
@protocol ButtonDelegate//对协议进行声明,
@end
//声明监听器符合buttondelegate规则
//类遵守协议只需要加入<>
@interface ButtonListener :NSObject <ButtonDelegate>
@end
4.符合协议,就要实现协议的onclick方法
#import "ButtonListener.h"
#import "Button.h"
//指导协议有哪些方法
@implementation ButtonListener
-(void)onClick{
NSLog(@"ButtonListener was clicked");
}
@end
由于没有真实按钮,我们需要模拟按钮点击,在button.h文件中声明onClick方法
//模拟点击按钮
//-(void)click;
实现按钮点击
-(void) click{
//按钮被点击,就应该通知监听器,并告诉监听器哪个按钮被点击
//如果_delegate实现了onClick:这个方法
if ([_delegaterespondsToSelector:@selector(onClick:)]) {
[_delegateonClick:self];
}else{
NSLog(@"not onclick:");
}
}
演示操作
#import <Foundation/Foundation.h>
#import "Button.h"
#import "ButtonListener.h"
int main(int argc,constchar * argv[])
{
@autoreleasepool {
//初始化一个按钮
Button *btn=[[[Buttonalloc]init]autorelease];
//初始化按钮监听器
ButtonListener *btnlistener=[[[MyListener alloc] init] autorelease];
//设置监听器
/*delegate需要遵守buttondelegate协议 @property (nonatomic, retain) id<ButtonDelegate> delegate;
在定义buttonlister的时候有定义遵守此协议 @interface ButtonListener : NSObject <ButtonDelegate>*/
btn.delegate=btnlistener;
//点击按钮
[btn click];
}
return 0;
}
此方法只限于一个按钮对应一个监听器,其实一个监听器可以给多个按钮用。
这个时候需要知道onClick 的是哪个按钮
将onclick改为
-(void)onClick:(Button *)btn;
那么监听器实现就改为
-(void)onClick:(Button *)btn{
NSLog(@"mylistener was clicked-%@ ",btn);
}
实现监听两个按钮#import <Foundation/Foundation.h>
#import "Button.h"
#import "MyListener.h"
int main(int argc,constchar * argv[])
{
@autoreleasepool {
//初始化一个按钮
Button *btn=[[[Buttonalloc]init]autorelease];
//初始化监听器
MyListener *mlistener=[[[MyListeneralloc]init]autorelease];
//设置监听器
btn.delegate=mlistener;
NSLog(@"button is clicked-%@",btn);
//点击按钮
[btn click];
Button *btn2=[[[Buttonalloc]init]autorelease];
btn2.delegate=mlistener;
NSLog(@"button2 is click-%@",btn2);
//点击按钮
[btn2 click];
}
return0;
}
其实我们可以像添加category中那样添加protocol. 在在其中去声明需要的方法,
方法前有
#import <Foundation/Foundation.h>
@class Button;
@protocol ButtonDelegate <NSObject>
@require
这些方法必须实现
但是编译器并不强求某个类必须实现
@optional
方法可以实现,可以不实现
//盘点某个类有没有遵守某个协议conformsToProtocol
if ([btn conformsToProtocol:@protocol(ButtonD)]) {
NSLog(@"YES");
}
//respondsToSelector 判断是否实现了某方法
if (![btn respondsToSelector:@selector(test)]) {
NSLog(@"not achieve");
}
本文介绍了Objective-C中的Protocol,它类似于Java的接口,用于定义一组独立于具体类的方法。通过Protocol,可以实现Delegation模式,例如在按钮点击事件的处理中。文中展示了如何定义和使用Protocol,包括定义代理协议、声明和实现协议方法,以及如何检查对象是否遵循协议。此外,还讨论了Protocol的@required和@optional特性,以及在多按钮场景下如何区分触发按钮。
214

被折叠的 条评论
为什么被折叠?



