+load方法

网上有很多这样的面试题,之前也有人问过我。但是一直也没有时间进行详细的探索,并做记录。

最近正好拿出来进行研究。下面会用到源码objc4-781,在官网上下载最新的。

我们先来看一下+load方法,我们新建几个类和分类,类和分类里面写上+load方法,并做打印

main函数里面什么也不写,头文件也不需要引入,我们运行一下,看一下会有什么效果。

运行之后的结果

我们可以看到这里已经调用了上面定义的类和分类的+load方法,我们什么都没有做,为什么会调用呢?

我们想要分析为什么,还需要从源码进行分析。

首先我们要找到runtime的入口,入口是在objc-os.mm文件下面的_objc_init方法


_objc_init方法

_dyld_objc_notify_register里面load_images点进去之后下面有个 call_load_methods()方法点进去

call_load_methods()

上面是先调用类方法里面的+load方法,下面是调用分类里面的+load方法。从上面的打印结果我们也可以看出是先调用类的在调用分类的。看一下调用方法里面的实现。


call_class_loads()

loadable_classes是非懒加载类+load 方法的数组。是loadable_class结构体,里面包含Class和IMP两个变量。所以classes里面也是同样的,之后用for循环遍历直接调用load方法。

但是loadable_classes数组里面的东西还有一些细节需要注意。就是里面存储结构体的顺序什么样的。因为顺序不同调用的结果也就不一样。到底在哪里看呢?

上面我们有一个load_images方法,里面有一句prepare_load_methods((const headerType *)mh);代码,点进去

prepare_load_methods

我们可以看到classlist里面放的是所有不是懒加载的类,通过for循环调用schedule_class_load这个方法。

schedule_class_load

add_class_to_loadable_list这个方法里面就是把有+load的发放入到loadable_classes数组中。但是上面可以看出使用了递归,

是对传入进来类的父类进行遍历。所以加入loadable_classes数组放把父类的+load方法先放到里面。所以在下面调用的时候是先调用父类的+load。

除了继承关系以外,其他的顺序是按照编译的顺序进行调用。

分类原理类似,但是不会像类一样先调用父类的load,分类只是单纯的按照编译顺序进行调用。

prepare_load_methods

这里也可以看出直接就调用添加数组里面。

总结一下+load方法

1、+load方法会在runtime加载类和分类时调用

2、调用的顺序有几个注意点(先调用类的load方法,如果类有继承关系先调用父类的load方法---类才有的,分类没有,其他情况就是按照编译的顺序进行调用,先编译先调用)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,588评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,456评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,146评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,387评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,481评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,510评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,522评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,296评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,745评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,039评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,202评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,901评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,538评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,165评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,415评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,081评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,085评论 2 352

推荐阅读更多精彩内容

  • 精华总结:Category中有load方法, load方法会在runtime加载类的时候调用 类的load方法调用...
    二斤寂寞阅读 2,110评论 0 3
  • Objective-C之Category的底层实现原理Objective-C的+initialize方法调用原理分...
    RUNNING_NIUER阅读 1,973评论 0 13
  • +load方法会在程序初始化时候调用 每个类和分类的+load方法都会调用,并且只调用一次 调用顺序1. 先调用类...
    Nomo_C阅读 640评论 0 0
  • 原文在我的blog objc.com +load方法简介 +load方法在这个类的文件被程序装载时调用。只要是在C...
    字节码阅读 976评论 0 0
  • 一、调用规则 1、一个类的load方法在所有父类load方法调用之后调用 2、分类的load方法在当前类的load...
    Code_人生阅读 194评论 0 0