+load方法与+initialize方法
- load:iOS应用启动时会加载所有类,加载类的时候调用.
缺点:当加载类需要的资源比较昂贵,或者比较耗时时,可能导致不良的用户体验,或者系统抖动。
- initialize:类加载时不会执行该方法,只有当实例化该类时,在该实例接收到第一个消息前执行该方法。可以看做类加载的延时方法。
alloc会为类实例化在堆上分配变量,此时会调用一次initialize方法,且仅调用一次,再次alloc时,不会再调用initialize方法了。
initialize会在运行时仅被触发一次,如果没有向类发送消息的话,这个方法将不会被调用,该方法是线程安全的,父类会比子类先收到此消息。
如果希望在类及其Category中执行不同的初始化的话,可以使用+load方法。+(void)load; 在Objective-C运行时载入类或者Category时被调用这个方法对动态库和静态库中的类或Category都有效.
在Mac OS X 10.5及之后的版本,初始化的顺序
- 调用所有的Framework中的初始化方法
- 调用所有的+load方法
- 调用C++的静态初始化方及C/C++中的attribute(constructor)函数
- 调用所有链接到目标文件的framework中的初始化方法
一个类的+load方法在其父类的+load方法后调用。
一个Category的+load方法在被其扩展的类的自有+load方法后调用。
在+load方法中,可以安全地向同一二进制包中的其它无关的类发送消息,但接收消息的类中的+load方法可能尚未被调用。
初始化方法执行顺序
- 按顺序执行所有定义的类的load方法
- 按顺序执行所有定义的类的Category的load方法(前提是重写了load方法)
- 按顺序首次向类实例发送消息前执行initialize方法
网友评论