OC 和 swift 创建单例方法

简介: 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!
    }
}


相关文章
|
12天前
|
Swift iOS开发
Swift 方法
10月更文挑战第29天
16 4
|
6月前
|
Swift Perl
OC和swift混合工程更新库时报:target has transitive dependencies that include statically linked binaries
OC和swift混合工程更新库时报:target has transitive dependencies that include statically linked binaries
98 0
|
6月前
Swift4.0判断本函数是否在其它类有相同的方法
Swift4.0判断本函数是否在其它类有相同的方法
43 0
|
API Swift iOS开发
45 Swift和OC的混编
Swift和OC的混编
123 0
|
Swift iOS开发
iOS OC混编Swift 后者无法走断点
iOS OC混编Swift 后者无法走断点
81 0
|
Swift 开发者
Swift - swift3.0中代理方法的使用
Swift - swift3.0中代理方法的使用
88 0
|
Swift iOS开发
Swift - 与OC混编时如何创建桥接头文件
Swift - 与OC混编时如何创建桥接头文件
469 0
Swift - 与OC混编时如何创建桥接头文件
|
Swift iOS开发
oc与swift混编
1.swift中调用oc;2.oc中调用swift
287 0
oc与swift混编
|
Swift
Swift和OC控制器互相跳转
Swift和OC控制器互相跳转
321 0
|
Swift 索引
Swift - 字典排序方法
Swift - 字典排序方法
178 0