我的问题与这个问题非常相似: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
/init
或 alloc
/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/