Protocol简单来说就是一系列不属于任何类的方法列表,其中声明的方法可以被任何类实现,这种模式一般称为代理模式(delegation)。通过Protocol定义各种行为,在不同的场景采用不同的实现方式。
在Xcode上新建文件,选择Objective-C protocol方式创建Protocol:
Protocol填写协议名:
因为Protocol可以被任何类实现,所以只会生成一个头文件:
ButtonDelegate.h
1 #import <Foundation/Foundation.h> 2 3 @class Button; 4 5 // Protocol本身可以继承 6 @protocol ButtonDelegate <NSObject> 7 8 // 声明一个协议方法 9 - (void) onClick:(Button *)btn; 10 11 @end
Button.h
1 #import <Foundation/Foundation.h> 2 3 #import "ButtonDelegate.h" 4 5 @interface Button : NSObject 6 7 @property(nonatomic, retain) id<ButtonDelegate> delegate; 8 9 // 模拟点击按钮 10 - (void)click; 11 12 @end
Button.m
1 #import "Button.h" 2 3 @implementation Button 4 5 // 模拟点击按钮 6 - (void)click { 7 // 判断是否有实现onClick:方法 8 if ([_delegate respondsToSelector:@selector(onClick:)]) { 9 // 调用onClick:方法 10 [_delegate onClick:self]; 11 } else { 12 NSLog(@"没有实现onClick:方法"); 13 } 14 } 15 16 - (void)dealloc 17 { 18 [_delegate release]; 19 [super dealloc]; 20 } 21 22 @end
ButtonListener.h
1 #import <Foundation/Foundation.h> 2 3 #import "ButtonDelegate.h" 4 5 //<>代表实现某个协议,可以在<>内引入多个Protocol,用,号分隔 6 @interface ButtonListener : NSObject <ButtonDelegate> 7 8 @end
ButtonListener.m
1 #import "ButtonListener.h" 2 3 @implementation ButtonListener 4 5 // 实现协议中的onClick:方法 6 - (void)onClick:(Button *)btn { 7 NSLog(@"%@按钮被点击了", btn); 8 } 9 10 @end
main.m
1 #import <Foundation/Foundation.h> 2 #import "Button.h" 3 #import "ButtonListener.h" 4 5 int main(int argc, const char * argv[]) 6 { 7 8 @autoreleasepool { 9 //创建一个按钮 10 Button *btn = [[[Button alloc] init] autorelease]; 11 //创建一个侦听器 12 ButtonListener *listener = [[[ButtonListener alloc] init] autorelease]; 13 //设置按钮的侦听器 14 btn.delegate = listener; 15 //模拟点击按钮 16 [btn click]; 17 18 } 19 return 0; 20 }