美文网首页初见
BlocksKit+UIKit 源码解读

BlocksKit+UIKit 源码解读

作者: 孔凡伍 | 来源:发表于2018-06-25 16:01 被阅读52次

    UIImagePickerController+BlocksKit.h 类别实现2个 block 方法回调 如下, image.png 动态代理对象 image.png .m 实现 image.png

    bk_registerDynamicDelegate 方法主要实现内容

    1 动态创建 a2_delegate 属性。并与原 UIImagePickerController delegate 属性做方法交换。
    2 在 a2_delegate setter 方法中创建动态代理对象 A2DynamicUIImagePickerControllerDelegate 并设置 UIImagePickerController delegate 属性为 动态代理对象 。
    3 如果你设置 UIImagePickerController delegate 那【动态代理对象】 realDelegate 属性会持有实现协议对象。

    image.png
    上图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 块。如果都实现了是都调用的,并不影响原写法方式。

    这是整体实现思路,具体实现细节待学明白在来记录。

    相关文章

      网友评论

        本文标题:BlocksKit+UIKit 源码解读

        本文链接:https://www.haomeiwen.com/subject/xysyyftx.html