私はObjective Cを初めて使用しますが、言語の静的コンストラクターに相当するものがあるかどうか、つまりそのクラスの最初のインスタンスの前に自動的に呼び出されるクラスの静的メソッドであるかどうかを知ることができませんでしたインスタンス化されます。または、自分で初期化コードを呼び出す必要がありますか?
ありがとう
+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オブジェクトが1つしかないため、==
演算子で同等性をテストする必要があります。これを使用して、特定のクラスの下の階層(まだ存在しない可能性がある)の各個別のクラスに対して1回だけ発生することをフィルタリングできます。
接線のトピックについては、以下の関連する方法についてまだ学習していない場合は、学ぶ価値があります。
aClass
自体に対してのみtrue)aClass
および子に対してtrue)編集:+initialize
の詳細を説明する@ bbumでこの投稿をチェックしてください:- http://www.friday.com/bbum/2009/09/06/iniailize-can-be-executed-multiple-times-load-not-so-much/
また、Mike Ashは+initialize
および+load
メソッドに関する金曜日の詳細なQ&Aを作成しました。 https://www.mikeash.com/pyblog/friday-qa-2009-05-22 -objective-c-class-loading-and-initialization.html
クラスが使用される前に呼び出される + initialize classメソッドがあります。
このトピックの補足事項:
__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.
}