ChatGPT解决这个技术问题 Extra ChatGPT

Objective-C中的静态构造函数等效?

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

谢谢


Q
Quinn Taylor

+initialize 方法在第一次使用类时自动被调用,在使用任何类方法或创建实例之前。您不应该自己打电话给 +initialize

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

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

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

在一个切题的话题上,如果您还没有学习以下相关方法,则值得学习:

- isMemberOfClass:(Class)aClass(仅适用于 aClass 本身)

- isKindOfClass:(Class)aClass (对于 aClass 和孩子为真)

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 还写了一篇关于 +initialize+load 方法的详细的周五问答:https://www.mikeash.com/pyblog/friday-qa-2009-05-22-objective-c-class-loading-and-initialization.html


"if ([self class] == [MyParentClass class])" [self class] 在这里是多余的。你可以说if (self == [MyParentClass class])
谢谢!您的花絮回答了我为什么要调用两次特定的静态初始化程序的问题。
N
Nathan Kinsinger

在使用类之前将调用 +initialize 类方法。


谢谢,这正是我要找的,但我搜索了“静态初始化”、“静态初始化程序”等,但没有找到。
几乎在所有情况下,在 Java 中你会说“静态”,而在 Objective-C 中会说“类”。
R
Richard J. Ross III

这个主题的一些附录:

还有另一种在 obj-c 中创建“静态构造函数”的方法,使用 __attribute 指令:

// prototype
void myStaticInitMethod(void);

__attribute__((constructor))
void myStaticInitMethod()
{
    // code here will be called as soon as the binary is loaded into memory
    // before any other code has a chance to call +initialize.
    // useful for a situation where you have a struct that must be 
    // initialized before any calls are made to the class, 
    // as they would be used as parameters to the constructors.
    // e.g.
    myStructDef.myVariable1 = "some C string";
    myStructDef.myFlag1 = TRUE; 

    // so when the user calls the code [MyClass createClassFromStruct:myStructDef], 
    // myStructDef is not junk values.
}

+load 会做同样的事情,并且看起来更符合 Objective-C 范式
@Grady 不,我在帖子中专门列出了 +load 不等效的情况。
@RichardJ.RossIII:根据 +load 的文档,在 __attribute__(constructor) 函数之前调用 +load 方法
@RichardJ.RossIII 我不明白您要实现什么,因为 +load 方法中的代码在用 constructor 属性装饰的函数中的代码之前执行。你能解释一下吗?也许在编辑你的答案。
@Sam 你明白了吗,RichardJ.Rosslll 在说什么?我想举一个现实生活中的例子...