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

クラス インスタンスがアクセスするインスタンス変数と、指定された初期化子内の静的変数を作成します。指定された初期化子は、文字列オブジェクトを 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 に答える