標籤:delegate class 類 控制項 ios
Objective-C中的Protocol
Protocol
簡單來說就是一系列方法的列表,其中聲明的方法可以被任何類實現,這種模式一般稱為(delegation)模式
在iOS中和OS X中,Apple採用了大量的代理模式來實現MVC中的View(UI控制項)和Controller(控制器)
下面舉個例子
聲明一個Button類和Buttonlisterner類
在Button.h檔案裡
#import <Foundation/Foundation.h>//類聲明@class Button;//<>代表實現某個協議,NSObject為做根本的協議//ButtonDelegate為協議的名稱@protocol ButtonDelegate<NSObject>-(void)onClick:(Button*)but;@end@interface Button : NSObject//nonatomic不需要多線程管理,delegate是按鈕的監聽器@property(nonatomic,retain) id<ButtonDelegate> 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 <Foundation/Foundation.h>#import "Button.h"//對協議提前聲明,跟@class的作用是一樣的@protocol ButtonDelegate;@interface Buttonlisterner : NSObject<ButtonDelegate>@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;}