load方法:
在类对象一被加载到进程的地址空间内,runtime就会向每个类对象发送load消息。对于程序可执行文件中的那些类而言,runtime在进程生命周期非常早的时候就会向其发送load消息。对于那些共享的动态加载的类库中的类,runtime在共享的类库一被加载到进程地址空间中,便向其发送load消息。
1)一个类若不实现load方法,便不会被调用。
2)若一个类没有实现load方法就不会调用,但若其父类实现了load方法,就会调用其父类的load方法。runtime会在向该类所有的父类对象(父类对象实现了load方法)和你链接的共享类库中所有的类对象发送load消息之后,向该类的类对象发送load消息,但是你并不会知道哪些类收到了load消息
3)category的load方法也会被调用,即使几个category实现了同一个类的load方法。这是属于特例,因为在通常情况下,若两个category定义了同一个类的同一个方法,那么其中的一个方法会被调用,而另一个方法将永远不会调用。category的load调用发生在主类的load调用之后。对于category而言,load消息是被单独发送的,这是同一个累的每个category都有各自的load方法的原因。
initialize方法:
runtime会在向类对象或类的实例对象发送第一条消息之前(除了load或initialize)调用类对象的initialize方法。initialize消息是以常用的机制被发送的,因此,若你的类中没有实现initialize方法,但被继承的父类实现了,那么会调用父类的initialize方法。若该类的父类还未被发送initialize消息,那么runtime会先向所有的这些父类发送initialize消息。initialize的运行过程是线程安全的。
比较:
load方法对于加入运行时系统中的每个类及分类来说,必定会调用此方法,而且仅调用一次。当包含类或分类的程序载入系统中,就会执行此方法,而这通常指应用程序启动时。load方法问题在于执行该方法时,系统处于“脆弱状态”,若代码还依赖其他程序库,那么程序库内相关类的load方法也必定会先执行。然而,根据某个给定的程序库,却无法判断出其中各个类的载入顺序。因此,在load方法中使用其他类是不安全的。此外,load方法若某个类没实现,那不管其父类是否实现,均不会被调用。而initialize方法由运行时系统调用,绝不应通过代码直接调用。它与load区别在于一是“惰性调用”,二是安全调用,即保证线程安全,三是若类未实现,则调用其父类的方法 。