Thread Safe Singleton in iOS6
我试图得到线程安全的单例设计模式的更新版本。这是我知道的一个版本。但是,我不能让它在IO6中工作
我想做的是:
这是我的上课方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | +(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; } |
此代码引发上面标记的错误。错误消息表示使用了未声明的标识符。此外,上述链接建议使用
1 | [[allocWithZone:nil] init] |
当我这样使用它时,它会抱怨
1 2 3 4 | +(id)allocWithZone:(NSZone*)zone { return [self instance]; } |
经过数小时的努力工作。如果有人能指出如何正确地做这件事,那就太好了。我花了很多时间在谷歌上,还没有找到一个完整的实现示例。
谢谢
为什么不直接使用+初始化?
1 2 3 4 5 6 7 8 9 10 11 | static MyClass *gSingleton; +(void) initialize { if ( self == [MyClass class] ) { gSingleton = [MyClass new]; } } +(MyClass*) getSingleton { return gSingleton; } |
它是线程安全的。唯一的问题是,它不会阻止某人使用alloc/init或new来分配第二个对象。