关于 +load方法和+initialize方法的要点
作者:
Gxdy | 来源:发表于
2018-09-04 11:25 被阅读0次
- 附加:关于
objc_msgSend
函数对方法调用的的简单说明
-
objc_msgSend
是runtime 消息发送机制,oc中大多数方法的调用本质上都是通过它来实现
- 方法调用是通过顺序遍历类对象或元类对象的方法数组中的函数,所以在前面的函数优先调用。
- 同时,方法在数组中的顺序则是
后编译的分类--先编译的分类-类的方法
- 另外 方法调用时,如果子类不存在则会通过superclass指针去访问父类的方法数组
-
+ load
方法
- 调用时刻:
load是在runtime
加载类、分类时调用(可以看成程序启动时)
- 调用方式 :
+load
方法是系统
根据方法地址直接调用
,并不是
经过objc_msgSend函数调用。但如果程序员手动调用
时,则会经过
objc_msgSend函数调用
- 调用次数
每个类、分类
的+load,在程序运行过程中只调用一次
- 调用顺序(系统自动调用)
1.先调用类
的+load
a> 按照编译先后顺序调用(先编译,先调用
)
b> 调用子类
的+load之前会先调用父类
的+load
2.再调用分类
的+load
按照编译先后顺序调用(先编译,先调用
)
-
+ initialize
方法
- 调用时刻:
+initialize
是类第一次接收到消息
的时候调用
- 调用方式 :
+ initialize
方法是经过objc_msgSend函数调用
- 调用次数
每一个类只会initialize一次,但是父类的initialize方法可能会被调用多次(子类没有实现时,会通过superClass去调用父类的initialize)
- 调用顺序
1> 先初始化父类 ()
2> 再初始化子类(如果子类没有实现就会调用父类的initialize方法 --> 继承
)
3> 如果分类也实现了+initialize
,则只会调用分类的+initialize
,遵循objc_msgSend
函数对方法调用原则
本文标题:关于 +load方法和+initialize方法的要点
本文链接:https://www.haomeiwen.com/subject/oqsiwftx.html
网友评论