目标C中的静态初始化程序

Joe*_*oey 10 static objective-c initializer

如何在objective-c中创建静态初始化器(如果我有正确的术语).基本上我想做这样的事情:

static NSString* gTexts[] = 
{
    @"A string.",
    @"Another string.",
}
Run Code Online (Sandbox Code Playgroud)

但是我想要更像struct这样做,即不仅仅为这个数组中的每个元素都有一个NSString,而是一个NSString加一个NSArray,它包含一个可变数量的MyObjectType,其中MyObjectType将包含一个NSString,一对int,等等.

Dav*_*ong 15

由于NSArraysMyObjectTypes是堆分配的对象,因此无法在静态上下文中创建它们.您可以声明变量,然后在方法中初始化它们.

所以你做不到:

static NSArray *myStaticArray = [[NSArray alloc] init....];
Run Code Online (Sandbox Code Playgroud)

相反,你必须做:

static NSArray *myStaticArray = nil;

- (void) someMethod {
  if (myStaticArray == nil) {
    myStaticArray = [[NSArray alloc] init...];
  }
}
Run Code Online (Sandbox Code Playgroud)

恰好适用于常量字符串(@"foo"等),因为它们不是堆分配的.它们被硬编码到二进制文件中.


chr*_*ish 7

确保静态初始化是线程安全的(在iOS 4.1 +中可用)非常重要!

static NSArray *myStaticArray = nil;

- (void) someMethod {
  static dispatch_once_t onceToken;
  dispatch_once(&onceToken, ^{
    myStaticArray = [[NSArray alloc] init...]
  });
}
Run Code Online (Sandbox Code Playgroud)