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;
}