相同点:都是可以自动被调用的,无需手动调用;并且它们的方法实现内部都是有锁的,是线程安全的
不同点:
(1)子类不实现load方法,父类的load方法就不会被调用,子类不实现init方法,父类也会调用init方法;
(2)load在main函数之前被调用,不是懒加载实现的;init是懒加载,只被执行一次
(3)load是只要类所在文件被引用就会被调用,而initialize是在类或者其子类的第一个方法被调用前调用。所以如果类没有被引用进项目,就不会有load调用;但即使类文件被引用进来,但是没有使用,那么initialize也不会被调用。
load详解:
在调用load方法之前
(1)会调用load_images用来扫描镜像中所有带+load符号的方法,将这些类加入到loadable_classes列表中,父类在前,子类在后,分类在loadable_category中
(2)先从loadable_classes中调用call_class_loads;然后loadable_category中call_category_loads
(3)使用场景:交换方法
initialize详解
在该类第一次调用方法时被调用,在alloc之前,alloc导致了initialize的执行,真正调用initialize方法的是c函数_class_initialize,强制父类先发送