面试总结 - load、initialize

+(void)load;
+(void)initialize;

load 和 Initialize 方法都在实例化对象之前调用,load相当于装载方法,都在main()函数之前调用,Initialize方法都在main() 函数之后调用
两个方法都不能主动调用,也不需要通过 super 继承父类方法,但是 Initialize 方法会在子类没有实现的时候调用父类的该方法,而 load 不会

load

call_load_methods分为两部分:call_class_loads和call_catogory_loads
调用顺序:
main之前,编译时调用,本质直接调用函数内存地址
***先调用所有类的load方法,再调用所有分类的load方法
先按编译顺序执行所有类的load方法,如果编译类为自定义子类,先load父类,再load本类,
等所有类执行完,再按编译顺序执行所有分类的load方法。

initialize (_class_initialize)

调用类方法时调用,本质使用objc_msgSend方法调用
如果有父类,先调用父类的方法,再调用本类的方法
如果本类没有实现该方法,可能会多次调用父类的initialize,分类的initialize方法可以覆盖。

发布了218 篇原创文章 · 获赞 19 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/songzhuo1991/article/details/104883496
今日推荐