Load 与 Initialize方法

Load 与 Initialize方法

1. load方法的调用顺序

大的顺序是 > 分类

在类中:

1. 按照compile sources的类顺序调用
2. 父类先于子类

各个分类则按compile sources内的顺序调用。

例如当前工程中compile sources内容为

MyViewController.m (subclass of ViewController)
MyViewController+category.m
AppDelegate.m
ViewController+category.m
ViewController.m

则, load方法调用顺序为:ViewController -> MyViewController -> AppDelegate -> MyViewController+category -> ViewController+category

2. 二者区别

+ load方法在Runtime中的调用方式为(*load_method)(cls, SEL_load),load_method是指向load函数的指针,用的是调用函数的方法。

+ load方法是当类或分类被添加到 Objective-C runtime 时被调用的。

+ initialize方法是在类或它的子类收到第一条消息之前被调用的,这里所指的消息包括实例方法和类方法的调用。

+ Initialize方法在Runtime中调用方式为((void(*)(Class, SEL))objc_msgSend)(cls, SEL_initialize), 用的是发送消息的方法。

因此一方面如果+ Initialize方法写在分类中,会覆盖原来的类方法,而+ load则不会;另一方面,消息发送,子类不实现会从父类中查找,如果一个类有多个子类都不实现+ Initialize方法,则父类的+ Initialize方法会被调用多次。因此,Method_Swizzle都会写在+ load方法中。

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,243评论 0 9
  • 这里所要介绍的 load 与 initialize 方法,这两个是类方法,是系统的方法。我曾经见过有人在自定义的c...
    CoderHG阅读 687评论 1 4
  • 最近在研究无侵入的开屏广告插入方式,受到众多大神的启示,利用NSObject的load方法。小白表示并不懂这个原理...
    Jun_简书阅读 628评论 0 4
  • 概述 Objective-C作为一门面向对象语言,有类和对象的概念。编译后,类相关的数据结构会保留在目标文件中,在...
    liuyanhongwl阅读 4,540评论 1 42
  • 这篇文章完全是基于南峰子老师博客的转载 这篇文章完全是基于南峰子老师博客的转载 这篇文章完全是基于南峰子老师博客的...
    西木阅读 29,594评论 33 467
  • 转眼物是人非,与你一起拍的雪景还在,和你的联系却飘散在风中。 在一起时也是我主动联系你多,你总说忙,可你却有时间打...
    一个人的春暖花开阅读 173评论 2 2
  • 又是清明了! 远方的亲人, 您在那边还好吗? 我... 我真的好想您, 想念您的笑, 想念您在我耳边的唠叨... ...
    半仙大仙阅读 165评论 0 1
  • 近来梦多。昨夜又梦,到一处水泊,岸边长满水草和树木,青翠欲滴。奇怪的是,莲蓬都长在树枝尽头。 附近还有不认识...
    夜未央and呓语阅读 114评论 0 0
  • 感恩雷牧师母耐心的教我们怎样做事,怎样牧养,就像父母耐心教自己孩子怎样为人处世,让我感觉到那种父母的爱和包容接纳,...
    周淑峰阅读 68评论 0 0