gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:36:21 24 4
gpt4 key购买 nike

覆盖initialize()常用于在类发送第一条消息(设置 UserDefaults 等)之前执行代码。文档指出,父类(super class)的实现可能会被多次调用,子类不会重写initialize(),并给出了一个示例,说明如何在initialize()的情况下保护类多次执行代码。 () 被调用多次:

The superclass implementation may be called multiple times if subclasses do not implement initialize()—the runtime will call the inherited implementation—or if subclasses explicitly call [super initialize]. If you want to protect yourself from being run multiple times, you can structure your implementation along these lines:

+ (void)initialize {
if (self == [ClassName self]) {
// ... do the initialization ...
}
}

我正在覆盖 AppDelegate 中的 initialize() 并尝试避免代码运行多次。类检查对我来说没有意义,因为检查 self 是否是 AppDelegate.Type 将始终评估为 true(并在 Xcode 中给我一个警告)。

由于我们不在父类(super class)中(AppDelegate 的父类(super class)是 UIResponder),类检查是否不适用?我的重写 initialize() 方法的内容是否仅运行一次而不调用 super 或执行类检查?

最佳答案

进行类检查的原因是因为您通常希望在 initialize 上运行代码仅一次(根据文档)。编写该条件可以保护您免受未实现 initialize 的子类的影响。或调用[super initialize] 。下面是一个类层次结构示例:

class Animal: NSObject {
class func initialize() {
//Some code I only want to run once
}
}


class Dog: Animal {}

当我实例化一个新的 Dog 时,Objective-C 运行时将发送 initialize Dog每个类的方法的层次结构(父类(super class)首先),所以 Dog将收到该消息,但 Animal 也会收到该消息。因为Dog没有实现initialize ,它的父类(super class)将接收该消息,因此如果您不添加检查以确保该消息是针对该类的,您的代码最终将执行两次。

这个doesn't really make sense in Swift ,在 AppDelegate 中可能更是如此,所以如果您想让代码在 Swift 中只运行一次,您可能应该使用延迟初始化的全局变量或静态属性,如 the migration docs 中定义的。 .

关于ios - 覆盖 AppDelegate 上的初始化 - 防止代码多次执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42818832/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com