Инициализировать статическую строку 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, который действительно знает материал.)