我是 Objective C 的新手,我无法找出语言中是否有静态构造函数的等效项,即类中的静态方法,将在此类类的第一个实例之前自动调用被实例化。还是我需要自己调用初始化代码?

谢谢

最佳答案

+initialize 方法在第一次使用类时自动调用 ,在使用任何类方法或创建实例之前。你永远不应该自己调用 +initialize

我还想传递一个我学到的花絮,它可能会咬你一口: +initialize 由子类继承,并且也为每个没有实现 +initialize 的子类调用它们自己的 +initialize214142如果您天真地在 +class 中实现单例初始化,这可能尤其成问题。解决方案是检查类变量的类型,如下所示:

+ (void) initialize {
  if (self == [MyParentClass class]) {
    // Once-only initializion
  }
  // Initialization for this class and any subclasses
}

从 NSObject 派生的所有类都有 -classClass 方法,它们返回 == 对象。由于每个类只有一个 Class 对象,我们确实希望使用 aClass 运算符来测试相等性。您可以使用它来过滤什么应该只发生一次,而不是为给定类下面的层次结构(可能尚不存在)中的每个不同类过滤一次。

在切入主题上,如果您还没有学习以下相关方法,则值得学习:
  • - isMemberOfClass:(Class)aClass(仅适用于 aClass 本身)
  • - isKindOfClass:(Class)aClass(适用于 +initialize 和 child )
  • + isSubclassOfClass:(Class)aClass(同上,但属于类方法)


  • 编辑: 查看@bbum 的这篇文章,其中解释了有关 +initialize 的更多信息:http://www.friday.com/bbum/2009/09/06/iniailize-can-be-executed-multiple-times-load-not-so-much/

    另外,Mike Ash 写了一篇关于 +load 和 0x251812231343141 方法的详细的周五问答:
    https://www.mikeash.com/pyblog/friday-qa-2009-05-22-objective-c-class-loading-and-initialization.html

    关于objective-c - 在Objective-C中等效的静态构造函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/992070/

    10-13 07:00