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

最佳答案

您可以使用+ (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

07-28 02:36