关于ios:iOS6中的线程安全单例

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来分配第二个对象。