iOS6中的线程安全单例

时间:2013-02-03 01:32:18

标签: ios objective-c design-patterns thread-safety singleton

我试图获得一个线程安全的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];
 }

经过几个小时的努力才能让它发挥作用。如果有人能够指出如何做到这一点,那就太好了。我花了很多时间谷歌搜索,并没有找到一个完整的实现示例。

由于

1 个答案:

答案 0 :(得分:0)

为什么不使用+ initialize?

static MyClass *gSingleton;

+(void) initialize {
  if ( self == [MyClass class] ) {
    gSingleton = [MyClass new];     
  }
}

+(MyClass*) getSingleton {
  return gSingleton;
}

这是线程安全的。唯一的问题是它不会阻止某人使用alloc / init或new来分配第二个对象。