-
Notifications
You must be signed in to change notification settings - Fork 53
+load 与 initialize
jiaxw32 edited this page Jul 28, 2020
·
2 revisions
load 与 initialize 方法实现要尽量精简,在里面设置一些状态,使本类能够正常运行即可,不要执行耗时太久或需要加锁的任务,不要依赖其他类。
- 每个类或分类加入运行时系统时,会调用 load 方法,而且只调用一次
- 如果分类和所属的类都定义了 load 方法,则先调用类的,再调用分类里的
- 执行 load 方法时,会先执行超类的 load 方法
- load 方法与普通方法不同,它不遵守继承规则。如果某个类没有实现 load 方法,不管其各级超类是否实现该方法,系统都不会调用
- 执行 load 方法时,运行时系统处于脆弱状态,在 load 方法中使用其他类是不安全的
-
initialize 方法在程序中首次使用该类之前调用,并且只调用一次。它是由运行时系统来调用的,不用通过代码直接调用该方法
-
initialize 是惰性调用的,只有当程序用到了相关的类时,才会调用。如果某个类一直没有使用,那么 initialize 方法也不会执行
-
运行时系统在执行该方法时,是处于正常状态的,此时可以安全使用并调用任意类中的任意方法。
-
initialize 方法是线程安全的,只有执行 initialize 的那个线程可以操作类或实例。其他线程都要先阻塞,等着 initialize 执行完
-
initialize 方法遵循继承规则,如果某个类未实现它,而其超类实现了,会先运行超类的代码
-
无法在编译期设定的全局变量,则可以放在 initialize 方法中初始化,initialize 方法通常应该在里面判断当前要初始化的是哪个类,如下所示:
#import <Foundation/Foundation.h> @interface EOCBaseClass : NSObject @end @implementation EOCBaseClass + (void)initialize { if (self == [EOCBaseClass class]) { NSLog(@"%@ initialized", self); } } @end @interface EOCSubClass : EOCBaseClass @end @implementation EOCSubClass @end