系统框架--51:精简initialize与load的实现

2023-11-22 08:33:32 浏览数 (1)

类的初始化

类必须先执行某些初始化操作,然后才能正常使用。OC中,绝大多数类都继承NSObject根类,该类有俩个方法用来实现初始化操作

代码语言:javascript复制
  (void)load
  (void)initialize 

(void)load

  • 对于加入运行期系统的每个类及分类来说,必定会调用此方法,而且仅此一次
  • 若类本身或分类都定义load方法,则先调用类里的,在调用分类的
  • 在执行load方法之前,必定先执行所有超类的load方法,如果代码还依赖了其他程序库,那么库里相关类的load方法也必定会执行

注:对于某个程序库,无法判断其中各个类加载的顺序,因此在load类加载其他类是不安全的

代码语言:javascript复制
#import "Person.h"
#import "Student.h"
@implementation Person
  (void)load{
    Student *stu = [[Student alloc]init];
}
@end
//无法判断Student这个类是否已经加载完毕,只有Student加载完毕之后,在可以使用,所以,在load类加载其他类是不安全的
  • load方法不遵从继承规则,如果某个类本身没有实现load方法,那么不管各级超类是否实现load方法,系统都不会调用
  • load方法务必实现得精简尽量少执行操作

(void)initialize

  • 对于每个类来说,initialize方法会在程序首次用该类之前调用,且只调用一次
  • initialize方法遵从继承规则,如果某个类没有实现它,而其超类实现了,那么就会运行其超类的实现代码
  • initialize方法务必实现得精简尽量少执行操作
  • initialize方法只应该用来设置内部数据,不应该调用其他方法

load与initialize的区别与相同点

  • load方法会把应用程序所有类load都执行完,才能继续其他逻辑;initialize是用哪个类执行哪个类,且为懒加载
  • initialize方法在运行期由系统调用,是处于正常状态的,线程也是安全的,而运行期执行load方法时不安全的
  • load与initialize方法都应该实现得精简一些,这有助于保持应用程序的响应能力,也能减少引入的几率

0 人点赞