简体   繁体   中英

Thread Safe Singleton in iOS6

Im trying to get an updated version of the Singleton Design Pattern which is thread safe. Here is one version that I know. However, I cannot make it work in iOS6

Here is what Im trying to do:

Here is my Class method

 +(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;
 }

This code throws an error as marked above. The error message says Use of undeclared identifier. In addition the link above recommends the use of

  [[allocWithZone:nil] init] 

When I use it like this it complains

  +(id)allocWithZone:(NSZone*)zone
 {
    return [self instance];
 }

After hours of trying to make it work. It would be great if someone could point out how to do this right. Ive spent much time googling and haven't found a complete implementation example.

Thanks

Why not just use +initialize?

static MyClass *gSingleton;

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

+(MyClass*) getSingleton {
  return gSingleton;
}

It's thread-safe. The only issue is that it doesn't prevent someone from allocating a second object by using alloc/init or new.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM