我是Objective C的新手,我无法找出语言中是否具有静态构造函数的等效项,即该类中的静态方法将在此类的第一个实例之前自动调用被实例化。还是我需要自己调用初始化代码?
谢谢
我是Objective C的新手,我无法找出语言中是否具有静态构造函数的等效项,即该类中的静态方法将在此类的第一个实例之前自动调用被实例化。还是我需要自己调用初始化代码?
谢谢
Answers:
在使用任何类方法或创建实例之前,第一次使用类时会自动+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对象,因此我们确实想测试与==
运算符的相等性。您可以使用它来过滤应该只发生一次的事件,而对于给定类之下的层次结构中的每个不同类(可能尚不存在),则只过滤一次。
在切线主题上,如果您尚未学习以下相关方法,则值得学习:
aClass
自身)aClass
和children)编辑:查看@bbum撰写的这篇文章,其中详细说明了以下内容+initialize
:http : //www.friday.com/bbum/2009/09/06/iniailize-can-be-executed-multiple-times-load-not-so-许多/
此外,迈克·阿什(Mike Ash)在星期五详细地介绍了有关+initialize
和+load
方法的问答:https :
//www.mikeash.com/pyblog/friday-qa-2009-05-22-objective-c-class-loading-and-initialization.html
在使用类之前,将先调用+ initialize类方法。
此主题的一些附录:
还有一种使用__attribute
指令在obj-c中创建“静态构造函数”的方法:
// 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
,+load
方法在__attribute__(constructor)
函数之前调用
+load
方法中的代码先于装饰有该constructor
属性的函数中的代码之前执行。你能解释一下吗?也许是在修改您的答案。
[self class]
在这里是多余的。您可以说if (self == [MyParentClass class])