我的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
内使用文件读取。是否有更合适的方法来实现相同的目标(共享静态字符串)?我可以把它埋在我的代码中,但是将稍微大的字符串维护为外部文件要容易得多。
感谢您的任何建议。
答案 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下面的评论,他真的知道了什么。)