来源:Objective-C Runtime类的加载与初始化(+ load;+ initialize) - 简书
Objective-C Runtime类的加载与初始化(+ load;+ initialize) - 简书
+load方法在类加载时,main()函数之前调用,+initialize方法在类收到第一条消息时调用,可能永远不会调用 main函数之后
两个方法的调用顺序都是先父类后子类,
+load方法在runtime中是直接以函数地址的方式进行调用,如果有多个分类,所有分类的+load方法也会被调用,并且在类的+load方法之后被调用,多个分类的+load方法调用顺序取决于编译的顺序
+initialize方法在runtime中是以发送消息的方式调用的,所以子类会覆盖父类的实现,分类会覆盖类的实现,多个分类只会调用一个分类的+initialize方法。
在使用时都不要过重地依赖于这两个方法,除非真正必要。在使用时一定要注意防止死锁!
都不需要调用[super load]、[super initialize]
load方法没有自动释放池,如果做数据处理,需要释放内存,则开发者得自己添加autoreleasepool来管理内存的释放。
和load不同,即使子类不实现initialize方法,也会把父类的实现继承过来调用一遍。注意的是在此之前,父类的方法已经被执行过一次了,同样不需要super调用。
网友评论