Objective-C中的Protocol
Protocol
簡單來說就是一系列方法的列表,其中聲明的方法可以被任何類實現,這種模式一般稱為(delegation)模式
在iOS中和OS X中,Apple采用了大量的代理模式來實現MVC中的View(UI控件)和Controller(控制器)
下面舉個例子
聲明一個Button類和Buttonlisterner類
在Button.h文件裡
#import//類聲明 @class Button; //<>代表實現某個協議,NSObject為做根本的協議 //ButtonDelegate為協議的名稱 @protocol ButtonDelegate -(void)onClick:(Button*)but; @end @interface Button : NSObject //nonatomic不需要多線程管理,delegate是按鈕的監聽器 @property(nonatomic,retain) id delegate; -(void)Click; @end
在Button.m文件裡
#import "Button.h" @implementation Button //-(void)dealloc{ // [super dealloc]; //} -(void)Click{ NSLog(@"Click按鈕被點擊了。。。"); //如果有onClick:的方法則調用此方法 if ([_delegate respondsToSelector:@selector(onClick:)]) { //並且告訴監聽器哪個按鈕被點擊了 [_delegate onClick:self]; } } @end
在Buttonlisterner.h文件裡
#import#import "Button.h" //對協議提前聲明,跟@class的作用是一樣的 @protocol ButtonDelegate; @interface Buttonlisterner : NSObject @end
在Buttonlisterner.m文件裡
#import "Buttonlisterner.h" #import "Button.h" @implementation Buttonlisterner -(void)onClick:(Button *)but { NSLog(@"onClick..."); } @end
在main.m中
int main(int argc, const char * argv[]) { @autoreleasepool { Button* button = [[Button alloc]init]; Buttonlisterner* listenter = [[Buttonlisterner alloc]init]; button.delegate=listenter; [button Click]; } return 0; }