iOS- load和initialize 子类,分类,父类,以及同名方法的调用顺序

环境介绍

编译文件顺序
编译文件顺序
目录文件(包含父类,子类,分类)
目录文件

+ (void)load

1.+load方法加载顺序:父类> 子类> 分类 (load方法都会加载)
注意:(如果分类中有A,B,顺序要看A,B加入工程中顺序) ,
可能结果:( 父类> 子类> 分类A> 分类B ) 或者( 父类> 子类> 分类B> 分类A )
2.+load方法不会被覆盖(比如有父类,子类,分类A,分类B,这四个load方法都会加载)。
3.+load方法调用在main函数前。

+ (void)initialize

+initialize方法加载顺序有以下4种情况
(1)分类 (子类没有initialize方法,父类存在或者没有initialize方法)
(2)分类> 子类 (多个分类就看编译顺序,只有存在一个)
(3)父类> 子类 (分类没有initialize方法)
(4)父类 (子类,分类都没有initialize方法)
总结+initialize:
1.当调用子类的+ initialize方法时候,先调用父类的,如果父类有分类, 那么分类的+ initialize会覆盖掉父类的。
2.分类的+ initialize会覆盖掉父类的
3.子类的+ initialize不会覆盖分类的
4.父类的+ initialize不一定会调用, 因为有可能父类的分类重写了它
5.发生在main函数后。

执行子类方法,看看initialize执行顺序:

[[Son new] commonInstanceMethod];

当工程中Person主类有initialize,分类不存在initialize,结果如下:

+[Person initialize]
+[Son initialize]
-[Son commonInstanceMethod]

当工程中Person主类有或无initialize,分类存在initialize,结果如下:

+[Person(A) initialize]
+[Son initialize]
-[Son commonInstanceMethod]

主类和分类有同名方法

主类和分类有同名方法,分类会覆盖主类的方法。最后只保留一个同名方法。
比如:主类Person和分类Person+A都有commonClsMethod类方法,执行程序结果如下:

+[Person(A) commonClsMethod]

github的demo:
InitializeAndLoadDemo

参考资料:
iOS - 分类中同名方法的调用顺序

猜你喜欢

转载自blog.csdn.net/samuelandkevin/article/details/104398068