Инициализировать статическую строку NSString на уровне класса

У меня есть NSString, которая должна быть постоянной в моем классе. Я использовал следующий код для достижения этой цели:

@interface DefinitionViewController ()
@end

static NSString *preamble;

@implementation DefinitionViewController {

}

+(void)initialize {
  if (self == [DefinitionViewController class]) {
    NSString *path = [[NSBundle mainBundle] pathForResource:@"preamble" ofType:@"html"];
    preamble = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding
    error:nil];
  }
}

Вроде нормально работает. Я беспокоюсь об использовании файла, прочитанного внутри initialize, Существуют ли более подходящие средства для достижения той же цели (общая статическая строка)? Я мог бы похоронить это внутри моего кода, но было намного проще поддерживать довольно большую строку как внешний файл.

Спасибо за любой совет.

1 ответ

Решение

"Я беспокоюсь об использовании файла, прочитанного внутри инициализации".

Не беспокойся. Тот факт, что это, например, метод класса, совершенно не имеет значения. Это код. Он работает и делает свою работу. Это звуковой код, он работает согласованно в одно и то же время, и ваш пакет приложений - это реальная вещь, которая действительно содержит ресурс. Здесь нет проблем.

Если вы хотите отложить создание строки и вдвойне убедиться, что строка не инициализируется дважды, вместо этого вы можете использовать шаблон синглтона, чтобы строковое значение не генерировалось до тех пор, пока оно не будет явно запрошено:

+ (NSString*) preamble {
    static NSString* preamble = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        NSString *path = [[NSBundle mainBundle] pathForResource:@"preamble" ofType:@"html"];
        preamble = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
    });
    return preamble;
}

Но особой необходимости в этом нет. (РЕДАКТИРОВАТЬ: Но см., Напротив, комментарий ниже @bbum, который действительно знает материал.)

Другие вопросы по тегам