iOS面试题-load 和 initlize的差异
+load
和+initialize
是两个与类的加载和初始化相关的特别办法。它们在类的生命周期中的效果和调用机遇有显着的差异。
+load
办法
- 调用机遇:
+load
在类初始加载进内存时调用,这一般发生在程序发动的时分,一切类和分类(Category)的+load
办法在运用程序的生命周期中只会被调用一次。 - 调用次序:首要调用类的
+load
办法,然后调用分类的+load
办法。假如有多个分类都完成了+load
办法,它们的调用次序是不确定的。 - 承继性:
+load
办法不会被主动承继,即便子类没有完成+load
办法,父类的+load
办法也会被调用。假如子类完成了+load
办法,那么父类和子类的+load
办法都会被调用。 - 线程安全:
+load
办法是线程安全的,Objective-C运行时确保+load
办法在多线程环境下安全履行。 - 运用场景:
+load
一般用于设置大局状况、注册类、交流办法完成(Method Swizzling)等,不主张在+load
中进行耗时操作,由于它会影响运用发动时刻。
+initialize
办法
- 调用机遇:
+initialize
在类或其子类的第一个办法被调用之前调用,它是懒加载的,只要在类实践被运用时才会被调用。 - 调用次序:假如子类没有完成
+initialize
办法,那么在子类的第一个办法被调用之前,父类的+initialize
办法会被调用。假如子类完成了+initialize
办法,那么父类的办法不会被调用,除非子类的+initialize
办法中显式调用了[super initialize]
。 - 承继性:
+initialize
办法会被主动承继,假如子类没有供给+initialize
的完成,那么会调用父类的完成。 - 线程安全:
+initialize
办法也是线程安全的,Objective-C运行时确保+initialize
办法在多线程环境下安全履行,并且在每个类中只会被调用一次。 - 运用场景:
+initialize
合适用于履行类的懒初始化,如初始化大局变量、修正静态数据结构等。
留意事项
- 防止在
+load
和+initialize
中编写杂乱或耗时的初始化代码,这可能会影响运用的发动功能。 +load
和+initialize
都不应该依赖于其他类的初始化代码,由于无法确保其他类的初始化次序。- 假如在
+initialize
中运用了多线程,要特别留意线程安全和死锁问题,虽然+initialize
自身是线程安全的。 - 在
+initialize
中拜访静态变量时,假如这些变量在其他当地被修正,需求留意同步问题。
其他
已然说这两个是特别办法,那么有哪些非特别的办法呢:
- 实例办法
-init: 实例的初始化办法,一般在创立目标后手动调用或在结构器中调用。
-dealloc: 实例被开释时调用的办法,用于履行整理作业。
-description: 回来目标描绘的字符串,一般用于调试。
以及其他自定义的实例办法,用于履行目标的详细行为。 - 类办法
+new: 类办法,用于创立类的新实例,它会调用alloc和init。
+someClassMethod: 自定义的类办法,用于履行与类相关的操作,而不是与特定实例相关的操作。