OC 和 swift 创建单例方法

OC单例

1.使用GCD(推荐使用)

+ (instancetype)sharedInstance {
    static Singleton *shared = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        shared = [[Singleton alloc] init];
    });
    return _shared;
}

2.单线程模式单例

+(Manager *)defaultManager{
  static Singleton *manager = nil;
  if(!manager){
      manager=[[Singleton alloc] init];
  }
  return  manager;
}

此单例只有在单个线程使用的情况下实用,在多线程的情况下,会产生线程不安全的情况。

3.多线程加锁单例

// @synchronized加锁
+(instancetype)defaultManager
{
    static Singleton *singleton;
    @synchronized (self) {
    if (!singleton) {
        singleton = [[Singleton alloc] init];
      }
    }
    return singleton;
}

加锁以后,当多个线程同时调用defaultManager时,由于@synchronized已经加锁,只能有一个线程创建Singleton实例。这样就解决了第一种情况的弊端。
缺点:只有在Singleton未创建时,加锁才是必要的。如果singleton已经创建,这个时候还加锁的话,会影响性能。

swift单例

1.方式一:类常量(建议使用)

   static let sharedInstance = Singleton()

2.方式二:嵌套结构体变量格式

class Singleton {
    class var sharedInstance: Singleton {
        struct Static {
            static let instance: Singleton = Singleton()
        }
        return Static.instance
    }
}

3.方式三:类似OC的创建方式dispatch_once

class Singleton {
    class var sharedInstance: Singleton {
        struct Static {
            static var onceToken: dispatch_once_t = 0
            static var instance: Singleton? = nil
        }
        dispatch_once(&Static.onceToken) {
            Static.instance = Singleton()
        }
        return Static.instance!
    }
}

你可能感兴趣的:(OC 和 swift 创建单例方法)