欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

IOS Swift3 四种单例模式详解及实例

程序员文章站 2024-02-18 20:38:58
swift3 单例模式 常见的有这么几种方法 第一种简单到爆的 final class single: nsobject { static l...

swift3 单例模式

常见的有这么几种方法

第一种简单到爆的

final class single: nsobject { 
  static let shared = single() 
  private override init() {} 
} 

final关键字的作用是这个类或方法不希望被继承和重写

第二种

public extension dispatchqueue { 
  private static var oncetoken = [string]() 
  public class func once(_ token: string, _ block: () -> void) { 
    objc_sync_enter(self) 
    defer { 
      objc_sync_exit(self) 
    } 
    if oncetoken.contains(token) { 
      return 
    } 
    oncetoken.append(token) 
    block() 
  } 
} 
 
final class single2: nsobject { 
  static func shared() -> single2 { 
    struct singleton { 
      static var single: single2? 
    } 
    dispatchqueue.once(nsuuid().uuidstring) { 
      singleton.single = shared() 
    } 
    return singleton.single! 
  } 
} 

第二种完全是oc风格的单例,但是由于swift3中废弃了原来的dispatch_once_t,所以需要先给dispatchqueue添加一个extension,实现原先的dispatch_once_t效果

第三种

private let single = single3() 
final class single3: nsobject { 
  static var shared: single3 { 
    return single 
  } 
} 

由于swift3中加强了权限控制,导致如果重写private override init()方法会报错,所以这种写法在swift3中的安全性未知。

第四种

final class single4: nsobject { 
  static var shared: single4 { 
    struct static { 
      static let instance: single4 = single4() 
    } 
    return static.instance 
  } 
  private override init() {} 
} 

在方法内定义静态变量

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!