0

Java で静的変数を初期化する必要がある場合は、次のようにすることができます。

public class MyClass {

  private static Object someStaticObject;
  static {
    // initialize  someStaticObject here
  }
  ...

Cocoa で同じことを行うにはどうすればよいでしょうか。

具体的には、ここに私が求めているものがあります: 私は多数のユーザー設定を持つアプリを持っています。次のように、すべてのメソッドが静的である 1 つのクラスからこれらすべての設定を管理したいと思います。

@implementation Preferences

    +(void)setMotion:(BOOL)isMotion {
      [[NSUserDefaults standardUserDefaults] setBool:isMotion forKey:keyIsMotion];
      [[NSUserDefaults standardUserDefaults] synchronize];
    }

    +(BOOL)isMotion {
      [[NSUserDefaults standardUserDefaults] boolForKey:keyIsMotion];
    }

コードのどこにでも簡単にアクセスして設定できるようにするには、次のようにします。

[Preferences setMotion:TRUE];  

また

if ([Preferences isMotion]) {
  ...

数十の静的メソッドを計画していることを考えると、静的変数のデフォルトを次のように定義したいと考えています。

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

上記の私のコードは次のようになります。

+(void)setMotion:(BOOL)isMotion {
  [defaults setBool:isMotion forKey:keyIsMotion];
  [defaults synchronize];
}

+(BOOL)isMotion {
  [defaults boolForKey:keyIsMotion];
}

しかし、それを達成する方法がわかりません。

4

2 に答える 2

1

+ (void)initializeObjective-C オブジェクトのメソッドを オーバーライドできます。

NSObjectの Apple Docs から:

ランタイムは、クラス、またはそれを継承するクラスがプログラム内から最初のメッセージを送信される直前に、プログラム内の各クラスに一度だけ初期化を送信します。(したがって、クラスが使用されていない場合、メソッドが呼び出されることはありません。) ランタイムは、初期化メッセージをスレッドセーフな方法でクラスに送信します。スーパークラスは、サブクラスの前にこのメッセージを受け取ります。

そのメソッドを使用して、静的 ivar や NSUserDefaults を初期化できます

于 2011-04-30T23:35:25.320 に答える
0

つまり、クラスの実装ファイルの実装ブロックで静的変数を宣言するだけです(ただし、メソッドの外部で宣言します)。次に、上記のように、静的変数へのアクセサメソッドを提供します。

Objective-Cのクラス変数を読み、この投稿も参照してください

于 2011-04-30T22:07:00.027 に答える