美文网首页
RunTime方法

RunTime方法

作者: DeerRun | 来源:发表于2018-12-13 11:00 被阅读15次

    对象(object),类(class),方法(method)这几个的结构体:

    //对象
    struct objc_object {
        Class isa  OBJC_ISA_AVAILABILITY;
    };
    //类
    struct objc_class {
        Class isa  OBJC_ISA_AVAILABILITY;
    #if !__OBJC2__
        Class super_class                                        OBJC2_UNAVAILABLE;
        const char *name                                         OBJC2_UNAVAILABLE;
        long version                                             OBJC2_UNAVAILABLE;
        long info                                                OBJC2_UNAVAILABLE;
        long instance_size                                       OBJC2_UNAVAILABLE;
        struct objc_ivar_list *ivars                             OBJC2_UNAVAILABLE;
        struct objc_method_list **methodLists                    OBJC2_UNAVAILABLE;
        struct objc_cache *cache                                 OBJC2_UNAVAILABLE;
        struct objc_protocol_list *protocols                     OBJC2_UNAVAILABLE;
    #endif
    } OBJC2_UNAVAILABLE;
    //方法列表
    struct objc_method_list {
        struct objc_method_list *obsolete                        OBJC2_UNAVAILABLE;
        int method_count                                         OBJC2_UNAVAILABLE;
    #ifdef __LP64__
        int space                                                OBJC2_UNAVAILABLE;
    #endif
        /* variable length structure */
        struct objc_method method_list[1]                        OBJC2_UNAVAILABLE;
    }                                                            OBJC2_UNAVAILABLE;
    //方法
    struct objc_method {
        SEL method_name                                          OBJC2_UNAVAILABLE;
        char *method_types                                       OBJC2_UNAVAILABLE;
        IMP method_imp                                           OBJC2_UNAVAILABLE;
    }
    
    • 1.系统首先找到消息的接收对象,然后通过对象的isa找到它的类。
    • 2.在它的类中查找method_list,是否有selector方法。
    • 3.没有则查找父类的method_list。
    • 4.找到对应的method,执行它的IMP。
    • 5.转发IMP的return值。

    下面讲讲消息传递用到的一些概念:

    • 类对象(objc_class)
    • 实例(objc_object)
    • 元类(Meta Class)
    • Method(objc_method)
    • SEL(objc_selector)
    • IMP
    • 类缓存(objc_cache)
    • Category(objc_category)

    Runtime应用
    Runtime简直就是做大型框架的利器。它的应用场景非常多,下面就介绍一些常见的应用场景。

    • 关联对象(Objective-C Associated Objects)给分类增加属性
    • 方法魔法(Method Swizzling)方法添加和替换和KVO实现
    • 消息转发(热更新)解决Bug(JSPatch)
    • 实现NSCoding的自动归档和自动解档
    • 实现字典和模型的自动转换(MJExtension)

    相关文章

      网友评论

          本文标题:RunTime方法

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