通过一个例子来理解委托模式
首先定义个协议
协议(protocol) :它可以声明一些必须实现的方法和选择实现的方法 (在java中称为接口)
// // StudentDelegate.h // test // // Created by 洪东楗 on 2017/4/19. // Copyright © 2017年 洪东楗. All rights reserved. // #import <Foundation/Foundation.h> @protocol StudentDelegate <NSObject> @optional - (void)write; @end
这个协议表示,你可以选择性的实现write这个方法
我们接着定义一个通用类
通用类:就好比NSTexiField,你想要调用的
// // Student.h // test // // Created by 洪东楗 on 2017/4/19. // Copyright © 2017年 洪东楗. All rights reserved. // #import <Foundation/Foundation.h> #import "StudentDelegate.h" @interface Student : NSObject @property (assign) id<StudentDelegate> delegate; - (void)read; @end
// // Student.m // test // // Created by 洪东楗 on 2017/4/19. // Copyright © 2017年 洪东楗. All rights reserved. // #import "Student.h" @implementation Student - (void)read { if ([_delegate respondsToSelector:@selector(write)]) { [_deleage write]; NSLog(@"read success"); } else { NSLog(@"read failed"); } } @end
这Student.h这个文件中 ,导入了刚刚所定义的协议StudentDelegate.h,并声明了一个delegate属性,这个属性是id类型的,id就是一个可以指向任何对象的指针,在这里指明了是StudentDelegate这个协议,并声明了read这个方法。
在Student.m这个文件中,实现了read方法。并在方法中表示,如果delegate这个对象,实现了write这个方法,那么就调用write方法,并输出"read success",否则输出"read failed"。
接着我们开始使用这个通用类
// // ViewController.m // test // // Created by 洪东楗 on 2017/4/19. // Copyright © 2017年 洪东楗. All rights reserved. // #import "ViewController.h" #import "Student.h" @interface ViewController () <StudentDelegate>@end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; Student *s = [[Student alloc] init]; s.deleage = self; [s read]; //s.num = 10; // Do any additional setup after loading the view, typically from a nib. } - (void)write{ NSLog(@"success"); } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end
在这里,通过实现StudentDelegate这个协议,让read方法去调用这个wirte
这就是一个委托,我调用Student对象中的read, Student对象就会自己判断是否有write,有则先调用write,否则输出read failed。
接下来是我个人的推断:
这就好比NSTextField,如果你实现了NSTextFieldDelegate这个协议中的textFieldDidBeginEditing这个方法,NSTextField对象就会在你点击textfield,准备输入时,自动的调用textFieldDidBeginEditing。
- (void)textFieldDidBeginEditing:(UITextField *)textField { NSLog(@"begin"); }
如这个,它就会自己在控制台输出begin。