覆盖AppDelegate上的初始化 - 防止多次执行代码

时间:2017-03-15 19:18:28

标签: ios swift uiapplicationdelegate

覆盖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或执行类检查?

1 个答案:

答案 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中所定义