在Objective-C中相当于静态构造函数?
我是新来的目标C,我还没有能够找出是否有相当于静态构造函数的语言,这是一个类中的静态方法,将自动在这样的类的第一个实例之前被调用被实例化。 还是我需要自己调用初始化代码?
谢谢
+initialize
方法在使用任何类方法或创build实例之前首次自动调用类。 你永远不应该打电话+initialize
你自己。
我也想传递一些小技巧,我知道可以咬你的路: +initialize
是由子类inheritance的,并且还要求每个没有实现自己+initialize
的子类 。 如果你天真地在+initialize
实现单例初始化,这可能是特别有问题的。 解决的办法是检查类variables的types如下所示:
+ (void) initialize { if (self == [MyParentClass class]) { // Once-only initializion } // Initialization for this class and any subclasses }
所有从NSObject派生的+class
都有返回Class
对象的+class
和-class
方法。 由于每个类只有一个Class对象,因此我们希望使用==
运算符来testing相等性。 您可以使用它来过滤应该只发生一次的事情,而不是一个给定的类下的层次结构(可能还不存在)中的每个不同的类。
关于一个相关的话题,如果你还没有这样做,那么值得学习下面的相关方法:
- – isMemberOfClass:(Class)aClass (仅适用于
aClass
本身) - – isKindOfClass:(Class)aClass (对于
aClass
和儿童是true) - + isSubclassOfClass:(Class)aClass (同上,但类方法)
编辑:看看这个post由@bbum解释更多关于+initialize
: http : //www.friday.com/bbum/2009/09/06/iniailize-can-be-executed-multiple-times-load-not- 非常/
另外,Mike Ash写了一个关于+initialize
和+load
方法的详细周五Q&A: https : //www.mikeash.com/pyblog/friday-qa-2009-05-22-objective-c-class-loading-and -initialization.html
在使用类之前,会调用+ initialize类的方法。
这个主题的一个附录:
还有另一种方法来在obj-c中使用__attribute
指令创build一个“静态构造函数”:
// 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. // eg myStructDef.myVariable1 = "some C string"; myStructDef.myFlag1 = TRUE; // so when the user calls the code [MyClass createClassFromStruct:myStructDef], // myStructDef is not junk values. }