zoukankan      html  css  js  c++  java
  • runtime机制

    runtime(简称运行时),是一套 纯C(C和汇编写的) 的API。而 OC 就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消息机制。

    消息机制原理:对象根据方法编号SEL去映射表查找对应的方法实现。

    每一个 OC 的方法,底层必然有一个与之对应的 runtime 方法。

    runtime常见作用:

    1、动态交换两个方法的实现

    2、发送消息

    3、动态添加方法

    4、拦截替换方法

    消息机制方法调用过程:

    1、OC 在向一个对象发送消息时,runtime 库会根据对象的 isa指针找到该对象对应的类或其父类中查找方法。

    2、注册方法编号(这里用方法编号的好处,可以快速查找

    3、根据方法编号去查找对应方法。

    4、找到只是最终函数实现地址,根据地址去方法区调用对应函数。

    runtime常见的方法:

    Person *p = [Person alloc];
    // 底层的实际写法
    Person *p = objc_msgSend(objc_getClass("Person"), sel_registerName("alloc"));

     // 获取某各类的方法

     Method imageNamedMethod = class_getClassMethod(self, @selector(imageNamed:));

    交换方法地址,相当于交换实现方式;method_exchangeImplementations 交换两个方法的实现

    获取类中所有的属性
    class_copyIvarList

     遍历属性找到对应name字段

    const char *varName = ivar_getName(var);


    例类的扩展常规下是不能添加成员属性的,但是可以通过runtime添加
    - (void)setName:(NSString *)name {
    // objc_setAssociatedObject(将某个值跟某个对象关联起来,将某个值存储到某个对象中)
    // object:给哪个对象添加属性
    // key:属性名称
    // value:属性值 /
    / policy:保存策略
    objc_setAssociatedObject(self, @"name", name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    } -
    (NSString *)name {
    return objc_getAssociatedObject(self, @"name");
    }
    这样就能添加上了 
    每一个对象内部都有一个isa指针,这个指针是指向它的真实类型,根据这个指针就能知道将来调用哪个类的方法。
  • 相关阅读:
    2012年春晚剧本
    研究机器人
    85.圆角边框的两大要素 Walker
    81.边框设置 Walker
    76.背景固定 Walker
    84.边框方向 Walker
    86.圆角边框设置 Walker
    82.边框宽度和边框颜色 Walker
    88.轮廓和样式重置 Walker
    77.背景简写 Walker
  • 原文地址:https://www.cnblogs.com/Acee/p/8808610.html
Copyright © 2011-2022 走看看