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)的模式达到代理多继承