4

在 Objective-C 类中,我只想将文本文件的内容加载到 NSString 中,以便该类的所有实例都可以使用它。

在 Java 世界中,多年来我了解到,如果不使用经过验证的惯用语,就线程安全而言很容易犯这种微妙的错误。所以我想确保我使用正确的成语。

你能给我看一个这样的Objective-C类的例子吗?

这是我开始的空课......

@interface TestClass : NSObject
- (NSString *)doSomething:(NSUInteger)aParam;
@end

@implementation TestClass {
}

- (id)init {
    self = [super init];
    if (self) {

    }
    return self;
}

- (NSString *)doSomething:(NSUInteger)aParam {
     // something with shared NSString loaded from text file, 
     //  depending on the value of aParam
     return @""; 
}
@end
4

4 回答 4

7

在 Objective C 中处理静态属性的一种惯用方法是将它们隐藏在类方法(带有 的方法+)后面。将您的字符串声明为static类方法的实现内部,并dispatch_once用于初始化:

+ (id)stringFromFile {
    static dispatch_once_t once;
    static NSString *sharedString;
    dispatch_once(&once, ^{
        sharedString = [NSString
            stringWithContentsOfFile:@"MyFile"
            encoding:... // ...supply proper parameters here...
            error:...];
    });
    return sharedString;
}

这种设置静态对象的方式是线程安全的。将sharedString被初始化一次,即使该方法是从多个线程同时调用的。

现在您可以通过调用从任何地方访问您的字符串[MyClass stringFromFile]

于 2012-08-28T13:30:10.450 回答
1

创建一个实例变量供您的类实例访问,并在您指定的初始化程序中创建一个静态变量。您指定的初始化程序应创建一次字符串对象(将其保存在静态变量中)并每次将其分配给实例变量。例如:

@implementation TestClass {
    NSString *_myString;
}

- (id)init {
    self = [super init];
    if (self == nil) return nil;

    static dispatch_once_t once;
    static NSString *aString = nil;
    dispatch_once(&once, ^{
        aString = ... // However you want to instantiate the string
    });
    _myString = aString;

    return self;
}

这使您可以在实例方法中访问字符串,就好像它是一个普通的实例变量一样,尽管字符串只创建一次并且每个实例都指向单个对象。

于 2012-08-28T13:59:13.170 回答
0
- (NSString *)doSomething:(NSUInteger)aParam { 

    static NSString *foo = nil;

    if (!foo) {
        //load foo
    }

    return @"";  
}
于 2012-08-28T13:31:19.770 回答
0

这将正确地指导您。

单例实例

关于 Objective-C 单例的注释

于 2012-08-28T13:31:21.330 回答