web-dev-qa-db-ja.com

Objective-Cで同等の静的コンストラクタ?

私はObjective Cを初めて使用しますが、言語の静的コンストラクターに相当するものがあるかどうか、つまりそのクラスの最初のインスタンスの前に自動的に呼び出されるクラスの静的メソッドであるかどうかを知ることができませんでしたインスタンス化されます。または、自分で初期化コードを呼び出す必要がありますか?

ありがとう

70
Franklin Munoz

+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回だけ発生することをフィルタリングできます。

接線のトピックについては、以下の関連する方法についてまだ学習していない場合は、学ぶ価値があります。


編集:+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

128
Quinn Taylor

クラスが使用される前に呼び出される + initialize classメソッドがあります。

51

このトピックの補足事項:

__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.
}
10