objective-c - 将 NSImage 初始化为静态对象

标签 objective-c cocoa design-patterns

我在 OSX 中有一个带有绘图例程的自定义控件。该控件的每个实例都使用相同的图像。

我想知道将这些图像实例化为可用于该类创建的所有实例的静态对象是否是一个好主意。

如果这是一个好主意,我如何以切刀的方式实现图像加载器? 我想在我的类(class)中添加类似的内容

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

关于objective-c - 将 NSImage 初始化为静态对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14375784/

相关文章:

ios - 从底部覆盖控制中心屏幕边缘平移?

java - 应用访问者模式来检测图中的循环

c# - 我应该在 C# 中使用异常来强制执行基类兼容性吗?

xcode - 在应用程序启动 OSX 时运行代码

PHP 内存缓存设计模式

objective-c - NSDatePicker 使用 Stepper 更改日期

objective-c - 制作幻灯片

objective-c - 从 Swift 访问 objective-c 结构

objective-c - XCode 4 连接检查器在源代码中添加新 IBOutlet 后未刷新

swift - NSMenuItem 给出的 bool 变量