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方法中设置图像。此方法在加载类时调用一次,它还处理同步。

作为一种选择,您可能会考虑将图像封装到“存储”单例类中。

@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]ETC...

于 2013-01-18T00:15:31.883 回答