objective-c - 带有 ARC 的 Interface Builder 中的单例

标签 objective-c macos interface-builder singleton automatic-ref-counting

我的问题与这个问题非常相似:Use Singleton In Interface Builder?

唯一的区别是我使用的是 ARC。所以,如果简化的话,我的单例看起来像这样:

Manager.m

@implementation Manager

+ (instancetype)sharedManager {
    __strong static id sharedInstance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[self alloc] init];
    });
    return sharedInstance;
}

@end

所以问题是,如果 Interface Builder 仍然与 ARC 一起使用,是否可以采用它?

当然,我知道在没有 ARC 的情况下重写该类可能会更简单,所以这个问题相当学术。 :)

最佳答案

当 nib 未归档时,它将尝试 alloc/initalloc/initWithCoder: 该类的一个新实例。

因此,您可以做的是拦截该调用并重新路由它以返回您的单例:

+ (id)sharedInstance {
  static Singleton *sharedInstance = nil;
  static dispatch_once_t onceToken;
  dispatch_once(&onceToken, ^{
    sharedInstance = [[self actualAlloc] actualInit];
  });
  return sharedInstance;
}

+ (id)actualAlloc {
  return [super alloc];
}

+ (id)alloc {
  return [Singleton sharedInstance];
}

- (id)actualInit {
  self = [super init];
  if (self) {
    // singleton setup...
  }
  return self;
}

- (id)init {
  return self;
}

- (id)initWithCoder:(NSCoder *)decoder {
  return self;
}

这允许 -init-initWithCoder: 在同一个对象上被安全地多次调用。通常不建议允许这样做,但考虑到单例已经是“事情可能变得非常不稳定的地方”的情况,这还不是你能做的最糟糕的事情。

关于objective-c - 带有 ARC 的 Interface Builder 中的单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13503103/

相关文章:

objective-c - 苹果支持GDataXML吗

python-3.x - 如何使用 Homebrew 在我的 Mac 上默认 Python3.8?

swift - 自定义属性的可读显示 (IB) 名称

ios - 带图像的 UICollectionView 单元格,单击更改背景

ios - 两个播放器的 iPad 应用程序 - 哪个播放器触摸了屏幕?

objective-c - __NSOperationInstruments 报告内部泄漏

macos - 在 Mac 的 Console.app 上打开管道

java - 无法在 Mac 上加载 jar-with-dependencies

ios - 顶部/底部布局指南受到限制的奇怪行为

ios - 自动布局高度按比例但有上限限制