BlocksKit+UIKit 源码解读
bk_registerDynamicDelegate 方法主要实现内容
1 动态创建 a2_delegate 属性。并与原 UIImagePickerController delegate 属性做方法交换。
2 在 a2_delegate setter 方法中创建动态代理对象 A2DynamicUIImagePickerControllerDelegate 并设置 UIImagePickerController delegate 属性为 动态代理对象 。
3 如果你设置 UIImagePickerController delegate 那【动态代理对象】 realDelegate 属性会持有实现协议对象。
上图28行,self 会赋值给 realDelegate
注意上图中情况只有显示的设置了代理 pick.delegate = self 动态代理对象才会被创建,但是在正常使用中(直接使用block)是不设置代理的。那动态代理对象就不会被创建。
bk_linkDelegateMethods: 方法主要实现内容
1 参数字典 key 对应 block 名 value 对应协议名字符串。
2 动态添加 key (也就是block) setter getter 方法。
3 setter 方法里 创建动态代理对象 A2DynamicUIImagePickerControllerDelegate 并绑定 block 块对象 并 设置当前UIImagePickerController delegate 为动态代理对象。和上步骤 2 功能一样。
弥补不设置外部代理无法创建动态代理情况。
A2DynamicUIImagePickerControllerDelegate 类
1 实现了 UIImagePickerControllerDelegate 协议
2 imagePickerControllerDidCancel: 方法内部实现。首先判断外部对象是否实现了协议,并调用协议。然后是否设置了 block 块对象,调用 block 块。如果都实现了是都调用的,并不影响原写法方式。