Objective-C和Swift实现单例的几种方式

本文介绍了在Swift及Objective-C中实现单例模式的不同方法,并探讨了如何通过单例模式实现跨类调用变量的需求。从三种OC单例模式实现到四种Swift单例模式实践,展示了不同平台下单例模式的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  在Swift开发中,我们对于跨类调用的变量常量,因为并没有OC中使用的全局头文件中写宏的形式,我们一般采用在类外定义全局变量/常量的形式来跨类调用。而问题在于目前写的项目需要在新添加的OC写的功能模块中调用Swift的全局变量,这样编译器是没办法帮你调到的。为了解决这个问题,我考虑来写一个Swift单例来保存全局变量,并由OC的类来调取数据。

  ps:差点忘记文章的初衷了。如果大家有好的用OC调取Swift的全局变量的方法,希望可以提供方法或网址,感激不尽。

  

  在iOS设计中,单例这种设计模式经常用到,也是是设计模式中最简单的一种,甚至有些模式大师都不称其为模式,称其为一种实现技巧。原因是设计模式讲究对象之间的关系的抽象,而单例模式只有自己一个对象,与其他对象之间并不抽象。但不可否认的是,单例已经方方面面的融入到我们的项目中来了,极为方便。

  那我们究竟在什么时候需要使用单例设计模式呢?

  顾名思义,当你只需要一个实例的时候需要使用单例,如UIApplication.sharedApplication() 等 ,就好比windows的任务管理器,回收站等等都是只能同时存在一个。

  

  一.OC中的单例设计模式有三种。简单介绍一下。

  首先,我们要创建一个继承于NSObject的类。在这个类的 .h头文件中,我们声明一个加方法。命名一般如下:

 1 + (SingleInstance *)sharedInstance; 

  随后在.m中实现这个方法。这里有三种形式,相对来说,安全和效率等级越来越高。

  1.直接创建

 1 static SingleInstance *singleOne;
 2 
 3 + (SingleInstance *)sharedInstance {
 4     
 5     if (!singleOne) {
 6         
 7         singleOne = [[SingleInstance alloc] init];
 8     }
 9     
10     return singleOne;
11 }

  非常好理解。创建一个静态的指针;如果指针没有指向对象,那么创一个对象并让指针持有该对象;最后返回这个指针持有的对象。因为静态,所以指针持有的对象不会被释放,也就保证了每次调取这个方法都只会返回一个对象,实现了单例的目的。

  不难看出,这种做法虽然简单明了,并且逻辑上并没有什么错误,但它并没有考虑线程安全的问题。在我们学习了多线程之后,我们就会考虑这段代码的安全性问题了。假设两条线程同时调用这段代码,并且若此时对象并未被创建,那么会创建几个对象?而若创建了多个对象,很明显与单例设计思想相违背。这样我们就有了以下的做法。

  2.加互斥锁

  根据我们刚才的分析,我们很自然会想到这样的做法:既然要防止多个线程同时访问这段代码,我们加个互斥锁,让线程们排队访问,不就解决了吗?

 1 static SingleInstance *singleTwo;
 2 
 3 + (SingleInstance *)sharedInstance {
 4  
 5     @synchronized (self) {
 6         
 7         if (!singleTwo) {
 8             
 9             singleTwo = [[SingleInstance alloc] init];
10         }
11     }
12     
13     return singleTwo;
14 }

  更加简单粗暴。一言不合就上锁,这段代码只能排队执行,一个一个来。这样完美的保证了单例只有一个对象的要求。

  但是更大的问题出现了,我确实只执行了一次,但是在第二次使用这个方法的时候,if判断语句还是需要走啊?大家创建完对象仍然一点一点排队走,太影响效率了吧?

  所以,强迫症如我们程序猿,是不允许这样耗费线程资源还执行效率低下的事情发生的。更好的方法来了。

  ps:互斥锁相关再解释一下,与多线程并发有关,意义基本在于多条线程访问同一时间访问同一段代码的时候要按顺序执行,不能并发。这样能有效解决多线程的安全问题。详情请百度。

  3.使用GCD技术

 1 static SingleInstance *singleThree;
 2 
 3 + (SingleInstance *)sharedInstance {
 4     
 5     static dispatch_once_t onceToken;
 6     
 7     dispatch_once(&onceToken, ^{
 8        
 9         singleThree = [[SingleInstance alloc] init];
10     });
11     
12     return singleThree;
13 }

   使用 dispatch_once 这个函数来创建对象,这样就保证了只有一个对象。问题解决。

  ps:dispatch_once是GCD中的一个对象,这个函数可以保证不管被调用几次,内部block只会执行一次,来保证代码执行的唯一性。

  

  综上,OC使用的单例方式一般就这三种,而我们使用的一般是第三种,安全性更高,执行效率更好。

  

 

  二.下面看看swift中的几种实现方式:

  1.

1     class SingleOne {
2         
3         //单例
4         static let shareSingleOne = SingleOne()
5     }
6     
7     let singleOne = SingleOne.shareSingleOne

  ps:代码编辑器中没有找到Swift语言,很尴尬..用OC凑活看吧

  一句话搞定,静态常量。所有地方用到的都是同一个。调用直接使用类名调取常量名即可。

  2.

 1     class SingleTwo {
 2         
 3         //单例
 4         class func shareSingleTwo() -> SingleTwo {
 5             
 6             struct Singleton{
 7                 
 8                 static var onceToken: dispatch_once_t = 0
 9                 
10                 static var single: SingleTwo?
11             }
12             
13             dispatch_once(&Singleton.onceToken, {
14                 
15                 Singleton.single = shareSingleTwo()
16             })
17             
18             return Singleton.single!
19         }
20     }
21     
22     let singleTwo = SingleTwo.shareSingleTwo()

  本质上与OC第三种方法一样,都是使用dispatch_once保证其中的代码只执行一次。中间用了一个结构体来保存两个静态变量,也可以不使用这个结构体。

  3.

 1 import Foundation
 2 
 3 //全局的常量
 4 let single = SingleThree()
 5 
 6 class SingleThree {
 7     
 8     class var sharedInstance : SingleThree {
 9         
10         return single
11     }
12 }
13 
14 let singleThree = SingleThree.sharedInstance

  4.

 1 import Foundation
 2 
 3 class SingleFour {
 4     
 5     static var sharedInstance : SingleFour {
 6        
 7         struct Static {
 8         
 9             static let instance: SingleFour = SingleFour()
10         }
11        
12         return Static.instance
13     }
14 }
15 
16 let singleFour = SingleFour.sharedInstance

  这次我们是在方法内定义静态常量。

  

  大概的创建单例的方式就是这些了。希望大家能有所收获。

 

转载于:https://www.cnblogs.com/SoulKai/p/5845012.html

JFM7VX690T型SRAM型现场可编程门阵列技术手册主要介绍的是上海复旦微电子集团股份有限公司(简称复旦微电子)生产的高性能FPGA产品JFM7VX690T。该产品属于JFM7系列,具有现场可编程特性,集成了功能强大且可以灵活配置组合的可编程资源,适用于实现多种功能,如输入输出接口、通用数字逻辑、存储器、数字信号处理时钟管理等。JFM7VX690T型FPGA适用于复杂、高速的数字逻辑电路,广泛应用于通讯、信息处理、工业控制、数据中心、仪表测量、医疗仪器、人工智能、自动驾驶等领域。 产品特点包括: 1. 可配置逻辑资源(CLB),使用LUT6结构。 2. 包含CLB模块,可用于实现常规数字逻辑分布式RAM。 3. 含有I/O、BlockRAM、DSP、MMCM、GTH等可编程模块。 4. 提供不同的封装规格工作温度范围的产品,便于满足不同的使用环境。 JFM7VX690T产品系列中,有多种型号可供选择。如: - JFM7VX690T80采用FCBGA1927封装,尺寸为45x45mm,使用锡银焊球,工作温度范围为-40°C到+100°C。 - JFM7VX690T80-AS同样采用FCBGA1927封装,但工作温度范围更广,为-55°C到+125°C,同样使用锡银焊球。 - JFM7VX690T80-N采用FCBGA1927封装铅锡焊球,工作温度范围与JFM7VX690T80-AS相同。 - JFM7VX690T36的封装规格为FCBGA1761,尺寸为42.5x42.5mm,使用锡银焊球,工作温度范围为-40°C到+100°C。 - JFM7VX690T36-AS使用锡银焊球,工作温度范围为-55°C到+125°C。 - JFM7VX690T36-N使用铅锡焊球,工作温度范围与JFM7VX690T36-AS相同。 技术手册中还包含了一系列详细的技术参数,包括极限参数、推荐工作条件、电特性参数、ESD等级、MSL等级、重量等。在产品参数章节中,还特别强调了封装类型,包括外形图尺寸、引出端定义等。引出端定义是指对FPGA芯片上的各个引脚的功能接线规则进行说明,这对于FPGA的正确应用电路设计至关重要。 应用指南章节涉及了FPGA在不同应用场景下的推荐使用方法。其中差异说明部分可能涉及产品之间的性能差异;关键性能对比可能包括功耗与速度对比、上电浪涌电流测试情况说明、GTH Channel Loss性能差异说明、GTH电源性能差异说明等。此外,手册可能还提供了其他推荐应用方案,如不使用的BANK接法推荐、CCLK信号PCB布线推荐、JTAG级联PCB布线推荐、系统工作的复位方案推荐等,这些内容对于提高系统性能稳定性有着重要作用。 焊接及注意事项章节则针对产品的焊接过程提供了指导,强调焊接过程中的注意事项,以确保产品在组装过程中的稳定性可靠性。手册还明确指出,未经复旦微电子的许可,不得翻印或者复制全部或部分本资料的内容,且不承担采购方选择与使用本文描述的产品服务的责任。 上海复旦微电子集团股份有限公司拥有相关的商标知识产权。该公司在中国发布的技术手册,版权为上海复旦微电子集团股份有限公司所有,未经许可不得进行复制或传播。 技术手册提供了上海复旦微电子集团股份有限公司销售及服务网点的信息,方便用户在需要时能够联系到相应的服务机构,获取最新信息必要的支持。同时,用户可以访问复旦微电子的官方网站(***以获取更多产品信息公司动态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值