10

Objective-C で静的イニシャライザを作成するにはどうすればよいですか (用語が正しい場合)。基本的に私はこのようなことをしたい:

static NSString* gTexts[] = 
{
    @"A string.",
    @"Another string.",
}

しかし、私はこれをもっと構造体のようにしたいです。つまり、この配列の各要素に対して NSString だけでなく、代わりに NSString と、MyObjectType が NSString 、いくつかの int などを含む MyObjectType の可変数を含む 1 つの NSArray を持ちます。 .

4

4 に答える 4

15

NSArraysとはヒープ割り当てオブジェクトであるためMyObjectTypes、静的コンテキストで作成することはできません。変数を宣言して、メソッドで初期化できます。

したがって、次のことはできません。

static NSArray *myStaticArray = [[NSArray alloc] init....];

代わりに、次のことを行う必要があります。

static NSArray *myStaticArray = nil;

- (void) someMethod {
  if (myStaticArray == nil) {
    myStaticArray = [[NSArray alloc] init...];
  }
}

これは、ヒープに割り当てられていないため、たまたま定数文字列 (@"foo"など) で機能します。それらはバイナリにハードコードされています。

于 2011-02-16T05:52:24.890 に答える
7

静的初期化がスレッドセーフであることを確認することが非常に重要です (iOS 4.1+ で利用可能)!!!

static NSArray *myStaticArray = nil;

- (void) someMethod {
  static dispatch_once_t onceToken;
  dispatch_once(&onceToken, ^{
    myStaticArray = [[NSArray alloc] init...]
  });
}
于 2011-06-30T20:46:08.757 に答える
2

objc ++の翻訳を使用できる場合は、次の1つの方法があります。

#import <Foundation/Foundation.h>

namespace { // ok, this storage should preferably be in a function/deferred
    static struct sa { NSString* const s; NSArray* const a; } r = {
      [[NSString alloc] initWithString:@"hello"],
      [[NSArray alloc] initWithObjects:@"w", @"o", @"r", @"l", @"d", @"= =", nil]
    };
}

int main(int argc, const char* argv[]) {
  NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
  NSLog(@"\n\n%@...\n\n...\n%@", r.s, r.a);
  [pool drain];
  return 0;
}
于 2011-02-16T06:46:52.807 に答える
2

+initialize メソッドは、クラス メソッドが使用されるかインスタンスが作成される前に、クラスが初めて使用されるときに自動的に呼び出されます。

+ (void) initialize {
  if (self == [MyClass class]) {
    // Once-only initializion
  }
  // Initialization for this class and any subclasses
}

+initialize はサブクラスによって継承され、独自の +initialize を実装していない各サブクラスに対しても呼び出されます。+initialize で単純にシングルトンの初期化を実装する場合、これは特に問題になる可能性があります。解決策は、クラス変数の型を確認することです。

ps +initialize 自分自身を呼び出すべきではありません。

于 2015-01-09T11:52:16.510 に答える