在类级别初始化静态NSString

时间:2014-02-10 04:58:42

标签: objective-c cocoa cocoa-design-patterns

我的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 个答案:

答案 0 :(得分:2)

  

“我担心在初始化中使用文件读取”。

不要(担心)。例如,它是一种类方法的事实是完全无关紧要的。这是代码。它运行并完成其工作。它是声音代码,它在连贯的时间内连贯地运行,并且您的应用程序包是真正包含资源的真实内容。这里没问题。

如果要推迟创建字符串,并确保字符串未初始化两次,则可以使用单例模式,以便在第一次显式请求字符串值之前不生成字符串值:

+ (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下面的评论,他真的知道了什么。)