load方法解析

作者: 南城同學 | 来源:发表于2019-08-13 19:46 被阅读0次
  • +load方法会在runtime加载分类、类时调用; (即使这个类根本没有调用过)
  • 每个类、分类的+load都会调用,且在程序运行过程中只调用一次;

类和分类中 +load的调用顺序:
  • 先调用类中的+load; 再调用分类的;
 do {
        // 1. Repeatedly call class +loads until there aren't any more
        while (loadable_classes_used > 0) {
            call_class_loads();
        }

        // 2. Call category +loads ONCE
        more_categories = call_category_loads();

        // 3. Run more +loads if there are classes OR more untried categories
    } while (loadable_classes_used > 0  ||  more_categories);
  • 先调用父类中的+load方法,再调用子类;
static void schedule_class_load(Class cls)
{
    if (!cls) return;
    assert(cls->isRealized());  // _read_images should realize

    if (cls->data()->flags & RW_LOADED) return;

    // Ensure superclass-first ordering
   //这是一个递归调用,传进来的参数如果有父类,就会再次执行,如果没有,就往下执行。
    schedule_class_load(cls->superclass);
  
    //所以父类在list的前面 
    add_class_to_loadable_list(cls);
    cls->setInfo(RW_LOADED); 
}

  • 如果没有各类之间没有关系,谁先参与编译,先调用的+load方法。

常规的方法和 +load 方法的区别 ?
  • 常规方法的调用是通过消息发送机制;
  • load方法是通过函数isa指针直接找到方法地址。

注意:如果 写成了[Objcet load] ,则转换成了消息发送机制。会先调用分类的+load方法.


load 方法可以继承吗 ?
  • 可以。
  • 可以继承,意味着可以写成[Object load],方法自己找不到,可以去父类找, load方法是系统自己调用的,即:方法原本就存在。

相关文章

网友评论

    本文标题:load方法解析

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