0

パスから画像をロードするクラス メソッドloadImage:(NSString *)pathがあります。パスが nil の場合、デフォルト パスの画像をロードします。

 +(NSImage *) loadImage:(NSString *)path{
   if(path== nil){
    path = [[NSBundle mainBundle] pathForResource:@"default" ofType:@"png"];
  }
}

デフォルトのパスは常に同じパスを使用しているため、メソッドを 1000 回実行した場合にパスを 1 回だけ計算したい場合は、次のようにします。

if(defaultPath == nil){
    defaultPath = [[NSBundle mainBundle] pathForResource:@"default" ofType:@"png"];
}
path = defaultPath;

、静的変数を使用できると思いますが、その方法がわかりません。助けてください。パフォーマンスの改善に関する提案を知ってうれしいです。

4

2 に答える 2

3

静的変数を使用してデフォルト パスを保持するだけです。

static NSString *defaultPath = …;
if (path == nil) {
   path = defaultPath;
}

ただし、パフォーマンス上の理由でそれを行う場合は、最初にそれが価値があることを確認してください。ほとんどの場合、それは時期尚早の最適化であり、問​​題を起こす価値はありません。

于 2012-09-02T07:29:43.790 に答える
1

この種の状況を適切に処理する GCD に基づく便利なパターンがあります。

+(NSImage *) loadImage:(NSString *)path{

    static NSString *storedPath;

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        storedPath = [[NSBundle mainBundle] pathForResource:@"default" ofType:@"png"];
    });

    // Do whatever you need to do with the default resource path.
}

dispatch_onceあなたが求めていることを正確に行います-初期化コードが1回だけ実行されるようにします。また、スレッドセーフです。

Xcode のコード補完は、パターンの使用にも役立ちます。入力を開始すると、テンプレートが直接dispatch_once取得されます。onceToken

于 2012-09-02T10:07:57.423 に答える