覆盖initialize()
在类发送第一条消息(设置UserDefaults等)之前执行代码很常见。文档说明了一个超类'可以多次调用实现子类不重写initialize()
,并举例说明如果多次调用initialize()
,多次保护类不执行代码的方法:
如果子类没有实现
initialize()
,则可以多次调用超类实现 - 运行时将调用继承的实现 - 或者如果子类显式调用[super initialize]
。如果您想保护自己不被多次运行,您可以按照这些方式构建您的实现:+ (void)initialize { if (self == [ClassName self]) { // ... do the initialization ... } }
我在我的AppDelegate中覆盖了initialize()
,并试图避免代码运行多次。班级检查对我来说没有意义,因为检查self is AppDelegate.Type
是否总是评估为真(并在Xcode中给我一个警告)。
班级检查不适用,因为我们不在超类中(AppDelegate
的超类是UIResponder
)?被覆盖的initialize()
方法的内容是否只运行一次而不调用super
或执行类检查?
答案 0 :(得分:0)
类检查的原因是因为您通常只想在user_id and category_id
上运行一次代码(根据文档)。编写该条件可以保护您免受未实现initialize
或调用initialize
的子类的影响。这是一个示例类层次结构:
[super initialize]
当我实例化一个新的class Animal: NSObject {
class func initialize() {
//Some code I only want to run once
}
}
class Dog: Animal {}
时,Objective-C运行时会将Dog
方法发送到 initialize
层次结构中的每个类(超类首先),Dog
将收到消息,但Dog
也是如此。由于Animal
未实现Dog
,因此其超类将接收消息,因此如果您不添加确保消息是针对该类的检查,则代码将最终执行两次。
这个doesn't really make sense in Swift,在AppDelegate中可能更少,所以如果你想让代码只在Swift中运行一次,你应该使用懒惰的初始化全局变量或静态属性,如the migration docs中所定义