我试图获得一个线程安全的Singleton Design Pattern的更新版本。 Here是我所知道的一个版本。但是,我无法在iOS6中使其工作
以下是我想要做的事情:
这是我的班级方法
+(id)getSingleton
{
static dispatch_once_t pred;
static EntryContainerSingleton *entriesSingleton = nil;
dispatch_once(&pred, ^{
entriesSingleton = [[super alloc] init];
});
return entriesSingleton;
}
+(id)alloc
{
@synchronized([EntryContainerSingleton class])
{
NSLog(@"inside alloc of EntryContainerSingleton");
ERROR >>>>> NSAssert(entriesSingleton == nil, @"Attempted to allocate a second instance of a singleton.");
ERROR >>>>> entriesSingleton = [super alloc];
ERROR >>>>> return entriesSingleton;
}
return nil;
}
-(id)init
{
self = [super init];
......Some custom INitialization
return self;
}
此代码抛出上面标记的错误。错误消息显示使用未声明的标识符。此外,上面的链接建议使用
[[allocWithZone:nil] init]
当我像这样使用它时会抱怨
+(id)allocWithZone:(NSZone*)zone
{
return [self instance];
}
经过几个小时的努力才能让它发挥作用。如果有人能够指出如何做到这一点,那就太好了。我花了很多时间谷歌搜索,并没有找到一个完整的实现示例。
由于
答案 0 :(得分:0)
为什么不使用+ initialize?
static MyClass *gSingleton;
+(void) initialize {
if ( self == [MyClass class] ) {
gSingleton = [MyClass new];
}
}
+(MyClass*) getSingleton {
return gSingleton;
}
这是线程安全的。唯一的问题是它不会阻止某人使用alloc / init或new来分配第二个对象。