第一种,使用GCD,利用dispatch_once方法。
dispatch_once函数如下:

void dispatch_once(dispatch_once_t *predicate, dispatch_block_t block);

dispatch_once接收两个参数,一个是dispatch_once_t,一个是块参数。对于给定的predicate,该函数保证相关代码块必定会执行,并且只执行一次,最重要的是这个方法是线程安全的。注意,对于只执行一次的块,传入的predicate必须是完全相同的,所以predicate常常会用static或者global来修饰。

MyClass.h

+ (id)shareManager;

MyClass.m

+ (id)shareManager {
     static MyClass *shareMyClass;
     @synchronized(self) {
          if (shareMyClass == nil) {
               shareMyClass = [[self alloc] init];
          }
     }
     return shareMyClass;
}

第二种,不使用GCD
MyClass.m

+ (id)shareManager {
     static MyClass *shareMyClass;
     @synchronized(self) {
          if (shareMyClass == nil) {
               shareMyClass = [[self alloc] init];
          }
     }
     return shareMyClass;
}

使用GCD的好处就是dispatch_once就确保了代码只会运行一次,并且不需要考虑线程安全的问题,因为GCD自己已经确保了线程的安全。

参考文章:
http://www.galloway.me.uk/tutorials/singleton-classes/
http://blog.csdn.net/sakulafly/article/details/34948689