2013-01-17 90 views
0

我在OSX中用繪圖程序定製了一個控件。此控件的每個實例都使用相同的圖像。將NSImage初始化爲靜態對象

我不知道是否將這些圖像實例化爲可用於該類創建的所有實例的靜態對象是一個好主意。

如果這是一個好主意,我該如何以切肉刀的方式實現圖像加載器? 我想添加到我的課像

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:@"...."]; 
     }); 
    } 
+1

爲什麼呢? 'imageNamed:'已經處理緩存爲你的 –

+0

我應該在每個繪圖週期調用imageNamed。我雖然最好設置一次圖像。 – MatterGoal

+0

我相信調用'imageNamed:'是不可擴展的,當圖像沒有被使用時,系統將能夠釋放它們在內存低的警告。同時在單個位置加載許多圖像可能需要很長時間並增加加載時間。 –

回答

1

你可以設置你的圖像在+ (void)initialize方法。這個方法在加載類時調用一次,它也處理同步。

作爲一個選項,您可能會想到將圖像封裝到「存儲」單例類中。

@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 
0

你總是可以懶惰的加載它們。

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

編輯: 只是想澄清,對於每一個那麼你需要在你的繪製方法調用

[self imageOne]等形象做這個...