Objective-C 静的クラスレベル変数 質問する

Objective-C 静的クラスレベル変数 質問する

Film クラスがあり、それぞれに一意の ID が格納されています。C#、Java などでは、static int currentID を定義でき、ID を設定するたびに currentID を増やすことができ、変更はオブジェクト レベルではなくクラス レベルで発生します。これは Objective-C で実行できますか? これに対する答えを見つけるのは非常に困難です。

ベストアンサー1

問題の説明:

  1. ClassA に ClassB クラス変数を持たせたいとします。
  2. プログラミング言語として Objective-C を使用しています。
  3. Objective-C は C++ のようにクラス変数をサポートしていません。

一つの選択肢:

Objective-Cの機能を使用してクラス変数の動作をシミュレートする

  1. classA.m 内で静的変数を宣言/定義して、classA メソッド (および classA.m 内に配置されたすべてのもの) のみがアクセスできるようにします。

  2. NSObject の初期化クラス メソッドを上書きして、静的変数を ClassB のインスタンスで 1 回だけ初期化します。

  3. なぜ NSObject の初期化メソッドを上書きする必要があるのか​​と疑問に思うかもしれません。このメソッドに関する Apple のドキュメントには、次のような答えがあります。「ランタイムは、プログラム内の各クラスに、クラスまたはそのクラスを継承するクラスにプログラム内から最初のメッセージが送信される直前に、initialize を 1 回だけ送信します。(したがって、クラスが使用されていない場合、メソッドが呼び出されることはありません。)」。

  4. 任意の ClassA クラス/インスタンス メソッド内で静的変数を自由に使用できます。

コードサンプル:

ファイル: classA.m

static ClassB *classVariableName = nil;

@implementation ClassA

...
 
+(void) initialize
{
    if (! classVariableName)
        classVariableName = [[ClassB alloc] init];
}

+(void) classMethodName
{
    [classVariableName doSomething]; 
}

-(void) instanceMethodName
{
    [classVariableName doSomething]; 
}

...

@end

参考文献:

  1. Object-C と C++ のアプローチを比較してクラス変数を説明します

おすすめ記事