IOS Swift3 四种单例模式详解及实例
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() {} }
在方法内定义静态变量
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
相关推荐
-
swift中正确安全声明一个单例的方法实例
Talk is cheap. Show me the code. class TestShareInstance{ var age:Int static let shareInstane:TestShareInstance = TestShareInstance(age: 3); private init(age:Int){ self.age = age; }; } 说说原理 swift在类中,类变量是能够保证线程安全,swift底层,static关键字的实际上是使用dispatch_once语
-
swift 单例的实现方法及实例
swift 单例的实现方法及实例 定义Game类,代码如下: public class Game { public var score = 0 public static let dafaultGame = Game() private init(){ } public func addscore(){ score += 10 } } 1.将init方法设置成private 2.定义静态变量 3.赋值给静态变量调用init方法 调用 let game1 = Game.dafaultGame ga
-
通过示例分析Swift单例模式
三种Swift实现单例模式的方法:全局变量,内部变量,dispatch_once方式 1. 全局变量 private let _singleton = Singleton() class Singleton: NSObject { class var sharedInstance: Singleton { get { return _singleton } } } 2. 内部变量 class Singleton { class var sharedInstance: Singleton { ge
-
Swift中定义单例的方法实例
什么是单例 单例模式是设计模式中最简单的一种,甚至有些模式大师都不称其为模式,称其为一种实现技巧,因为设计模式讲究对象之间的关系的抽象,而单例模式只有自己一个对象. 单例模式(Singleton Pattern),也叫单子模式,是一种常用的软件设计模式. 在应用这个模式时,单例对象的类必须保证只有一个实例存在. 单实例Singleton设计模式可能是被讨论和使用的最广泛的一个设计模式了,这可能也是面试中问得最多的一个设计模式了.这个设计模式主要目的是想在整个系统中只能出现一个类的实例.这样做当然
-
深入理解Swift中单例模式的替换及Swift 3.0单例模式的实现
前言 除了 MVC.MVVM 之外,单例模式可以说是 iOS 开发中另一常见的设计模式.无论是 UIKit 或是一些流行的三方库,我们都能看到单例的身影.而我们开发者本身也会潜意识地将这些类库中的代码当作最佳实践并将其带入日常工作中,哪怕很多人都知道单例存在一些明显的缺陷. 针对单例的缺陷,本文将介绍一些替换或改造单例模式的方法来提升代码质量. 单例的优点 除了上面提到的模仿最佳实践之外,单例的流行肯定也有内在的原因和理由.例如:单例对象保证了只有一个实例的存在,这样有利于我们协调系统整体的行为
-
IOS Swift3 四种单例模式详解及实例
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
-
IOS Swift3 四种单例模式详解及实例
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
-
Javascript 数组去重的方法(四种)详解及实例代码
Javascript 数组去重的四种方法 四种算法来实现这个目的: 第一种方法: Array.prototype.unique1 = function () { var n = []; //一个新的临时数组 for (var i = 0; i < this.length; i++) //遍历当前数组 { //如果当前数组的第i已经保存进了临时数组,那么跳过, //否则把当前项push到临时数组里面 if (n.indexOf(this[i]) == -1) n.push(this[i]); }
-
Python实现单例模式的四种方式详解
简介:单例模式可以保证一个类仅有一个实例,并提供一个访问它的全局访问点.适用性于当类只能有一个实例而且客户可以从一个众所周知的访问点访问它,例如访问数据库.MQ等. 实现方式: 1.通过导入模块实现 2.通过装饰器实现 3.通过使用类实现 4.通过__new__ 方法实现 单例模块方式被导入的源码:singleton.py # -*- coding: utf-8 -*- # time: 2022/5/17 10:31 # file: singleton.py # author: tom # 公众
-
Spring实例化bean的四种方式详解
目录 一.bean实例化——构造方法(常用) 二.bean实例化——静态工厂(了解) 三.bean实例化——实例工厂(了解) 四.bean实例化——FactoryBean(实用) 一.bean实例化——构造方法(常用) bean本质上就是对象,创建bean使用构造方法完成 BookDao接口: public interface BookDao { public void save(); } BookDaoImpl实现类,利用构造方式提供可访问的构造方法,输出相应字符串: import com.i
-
IOS 指纹识别两种方式详解及实例
IOS 指纹识别两种方式详解及实例 首先引入类名: #import <LocalAuthentication/LocalAuthentication.h> 然后在实现指纹识别的地方放入如下代码: 方式一: LAContext *lacontext = [[LAContext alloc]init]; // 判断设备是否支持指纹识别 BOOL isSupport = [lacontext canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWit
-
JS生成某个范围的随机数【四种情况详解】
前言: JS没有现成的函数,能够直接生成指定范围的随机数. 但是它有个函数:Math.random() 这个函数可以生成 [0,1) 的一个随机数. 利用它,我们就可以生成指定范围内的随机数. 而涉及范围的话,就有个边界值的问题.这样就包含四种情况: 1)min ≤ r ≤ max (一般这种比较常见) 2)min ≤ r < max 3) min < r ≤ max 4)min < r < max 一.min ≤ r ≤ max function RandomNumBoth(
-
PHP定义字符串的四种方式详解
1.简介 在PHP中这门语言中,因为是弱类型语言,因此使用变量时不需提前定义即可使用. 我们在使用php进行开发的时候,大多数使用双引号.单引号进行定义字符串.既然有这两种方式,那么他们之间肯定是有区别的. 并且,除了单双引号定义字符串这两种方式外,php还增加了heredoc和nowdoc这两种语法糖进行补充. 2.单引号与双引号 2.1.单引号 在单引号中,任何特殊字符都会按原样输出[除\\.\'将会被转义输出] eg. <?php $var = 'this is a var!'; echo
-
Java中遍历ConcurrentHashMap的四种方式详解
这篇文章主要介绍了Java中遍历ConcurrentHashMap的四种方式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 方式一:在for-each循环中使用entries来遍历 System.out.println("方式一:在for-each循环中使用entries来遍历");for (Map.Entry<String, String> entry: map.entrySet()) { System.out.pr
-
Python 非极大值抑制(NMS)的四种实现详解
目录 一. 几点说明 1. 简单说明Cython: 2. 简单介绍NMS: 二. 四种方法实现 1. 纯python实现:nms_py.py 2.直接利用Cython模块编译:nms_py1.pyx 3. 更改变量定义后再利用Cython模块编译:nms_py2.pyx 4. 在方法3的基础上利用GPU:gpu_nms.pyx 方法1:纯python语言实现:简介方便.速度慢 方法2:直接利用Cython模块编译 方法3:先将全部变量定义为静态类型,再利用Cython模块编译 方法4:在方法
随机推荐
- Shell字符串比较相等、不相等方法小结
- JavaScript游戏之优化篇
- SQL Server无法收缩日志文件的原因分析及解决办法
- js类式继承与原型式继承详解
- 计算两个字符串最大公有子串
- 110.iOS10新特性适配教程XCode8新特性解析
- Python 文件管理实例详解
- GridView常用操作事件图文介绍
- PHP 远程文件管理,可以给表格排序,遍历目录,时间排序
- Python ORM框架SQLAlchemy学习笔记之关系映射实例
- Golang读写Excel的方法教程
- C#从命令行读取参数的方法
- ASP读取日期单日期自动补零函数代码
- SQL的小常识, 备忘之用, 慢慢补充.
- javascript function调用时的参数检测常用办法
- linux中echo命令的用法实例教程
- Android 中 Fragment 嵌套 Fragment使用存在的bug附完美解决方案
- java判断字符串是否有逗号的方法
- Java语言中的内存泄露代码详解
- 浅谈线程通信wait,notify作用