基础
load 和 initialize
load
main函数之前执行
父类与子类都实现load函数时,父类优先级高于子类
类的load方法执行顺序优先于类别(Category)
当有多个类别(Category)都实现了load方法,这几个load方法都会执行,但执行顺序不确定(其执行顺序与类别在Compile Sources中出现的顺序一致)
有多个不同类的时候,每个类load执行顺序与Compile Sources出现顺序一致
子类未实现load方法,不会调用父类方法
initialize
initialize 在类或者子类的第一个方法被调用前调用,即使类文件添加进项目,但是没有使用,initialize不会调用,由系统调用,也不需要再调用 [super initialize],系统调用
父类initialize执行顺序优先于子类
类别Category会覆盖当前类中的方法,父类或者子类不影响
多个类别实现initialize方法,系统只会执行一个,执行Compile Sources 列表中最后一个Category 的initialize方法
子类未实现initialize,但是父类实现了initialize,系统会调用父类的initialize,相当于父类执行两次initialize (A-B-C 如果A实现了,创建C的时候一共会调用三次A方法)
总结
- load方法时的环境很不安全,尽量减少load方法的逻辑,load方法是线程安全的,它内部使用了锁,应该避免线程阻塞在load方法中, 场景
方法交换 - initialize方法主要用来对一些不方便在编译期初始化的对象进行赋值,业务优先级低的可以延迟到这个方法执行,比如 支付 , 线程安全,避免耗时阻塞
@property
KVC原理
KVO原理
Block原理
RunLoop原理
Runtime原理
消息发送