0

描画ルーチンを備えた OSX のカスタム コントロールがあります。このコントロールのすべてのインスタンスは同じ画像を使用します。

これらのイメージを、クラスによって作成されたすべてのインスタンスで使用できる静的オブジェクトとしてインスタンス化するのは良い考えでしょうか。

それが良いアイデアだった場合、どうすれば画像ローダーをクリーバーな方法で実装できますか? クラスに次のようなものを追加することを考えました

static NSImage *imageone; 
static NSImage *imagetwo;
static NSImage *imagethree; 

しかし、画像を初期化するより良い方法についてはわかりません...おそらくこのようなシングルトン関数ですか?

    + (void)setupSharedImages {
       static dispatch_once_t onceToken;

       dispatch_once(&onceToken, ^{
          imageone = [NSimage imageNamed:@"...."];
          imagetwo = [NSimage imageNamed:@"...."];
          image three = [NSimage imageNamed:@"...."];
       });   
     }
4

2 に答える 2

1

メソッドで画像を設定できます+ (void)initialize。このメソッドは、クラスのロード時に 1 回呼び出され、同期も処理します。

オプションとして、イメージを「ストレージ」シングルトン クラスにカプセル化することを考えることができます。

@interface ImageStorage : NSObject
+ (ImageStorage *)sharedStorage;
- (NSImage *)imageForKey:(NSString *)key;
@end

@implementation ImageStorage {
    NSDictionary *_images;
}

+ (ImageStorage *)sharedStorage
{
    static dispatch_once_t onceToken;
    static ImageStorage *sharedStorage;

    dispatch_once(&onceToken, ^{
       sharedStorage = [[ImageStorage alloc] init];
       _images = [[NSDictionary dictionaryWithObjectsAndKeys:image1, key1, image2, key2, nil] retain];
   });

   return sharedStorage;
}

- (NSImage *)imageForKey:(NSString *)key
{
    return [_images objectForKey:key];
}

@end
于 2013-01-17T09:29:09.027 に答える
0

いつでも遅延ロードできます。

- (NSImage *)imageOne {
    static NSImage *imageone;
    if(imageone == nil)
        imageone = [NSImage imageNamed:@"..."];
    return imageone;
}

編集:明確にしたかったのですが、必要な画像ごとにこれを行い、描画メソッド呼び出しで

[self imageOne]等...

于 2013-01-18T00:15:31.883 に答える