delegate 代理模式,是一种消息传递方式 一个完整的代理模式包括:委托对象、代理对象和协议 一对一的 (可以手动封装实现一对多) 实例: 委托对象, 协议 #import <Foundation/Foundation.h> @protocol TestDelegate <NSObject> - (void)eat:(NSString *)some; @end @interface Test : UIView @property (nonatomic, weak) id<TestDelegate> delegate; @end @implementation Test //点击启动代理 - (IBAction)done:(id)sender{ if ([self.delegate respondsToSelector:@selector(eat:)]) { [self.delegate eat:@"biscuit"]; } } @end 代理对象 : #import <Foundation/Foundation.h> #import "Test.h" @interface Tester : ViewController<TestDelegate> @property (nonatomic, strong)Test *test @end @implementation Tester - (void)viewDidLoad { [super viewDidLoad]; //设置代理 _test = [[Test alloc] init]; _test.delegate = self; } //实现代理回调 - (void)eat:(NSString *)some { NSLog(@"eat:%@", some); } @end 设置delegate属性是weak weak 弱引用, 对象释放后自动释放内存 strong/copy Copy 常用字符串和block , 当然strong也行 强引用,非循环引用对象释放后,自动释放. 否则都无法释放(内存泄漏) assign 常用在数据类型上(不自动释放,不引用) , 如果给id类型会导致无法释放(野指针) 协议 : 指定代理双方可以做什么,必须做什么 @optional 可选实现方法 @required (默认) 必须实现方法 不管可选还是必选, 都需要通过respondsToSelector:判断代理对象是否实现这个 方法 : 执行没有实现的方法会崩溃: if ([self.delegate respondsToSelector:@selector(eat:)]) { [self.delegate eat:@"biscuit"]; } NSProxy基类 : NSProxy和NSObject都是基类, 不过NSProxy不怎么常见 进入系统NSProxy.h文件 : + (id)alloc; //1.注意:只有alloc没有init方法 + (id)allocWithZone:(nullable NSZone *)zone NS_AUTOMATED_REFCOUNT_UNAVAILABLE; + (Class)class; //2.消息转发 - (void)forwardInvocation:(NSInvocation *)invocation; - (nullable NSMethodSignature *)methodSignatureForSelector:(SEL)sel NS_SWIFT_UNAVAILABLE("NSInvocation and related APIs not available"); - (void)dealloc; - (void)finalize; @property (readonly, copy) NSString *description; @property (readonly, copy) NSString *debugDescription; + (BOOL)respondsToSelector:(SEL)aSelector; 使用 消息转发: 重写 forwardInvocation 方法,将消息转发到真正的target的代理类 delegate 模拟多继承 : 对象是一对一继承的, 因此delegate对象也是单继承 但是NSProxy类拥有转发消息功能, 让NSProxy对象实现实现多协议,再让代理对 象拥有NSProxy就等于拥有多协议 : 流程 委托对象A 实现协议方法funcA 委托对象B 实现协议方法funcB 创建NSProxy对象, 并同时遵循两个协议 通过协议方法找到对应的委托对象去处理 最后,让代理对象拥有NSProxy对象, 通过NSProxy对象去调用相关协议方法 只负责转发消息,不用管委托对象如何实现 总结 : 协议是可以多继承的, 而NSProxy可以转发消息执行对象, 因此通过多协议继承中 间件(NSProxy)的模式达到代理多继承