Swift - 单例

单例模式 - Singleton


单例模式确保每个指定的类只存在一个实例对象,并且可以全局访问那个实例。一般情况下会使用延时加载的策略,只在第一次需要使用的时候初始化。在 iOS 中单例模式很常见,NSUserDefaults.standardUserDefaults() 、 UIApplication.sharedApplication() 、 UIScreen.mainScreen() 、 NSFileManager.defaultManager() 这些都是单例模式。


什么时候使用单例

当类的实例对象超过一个可能导致问题,可以选择使用单例。有些情况下对于类只有一个实例是很有意义的。例如:对于application只有一个实例对象,设备的屏幕对象只有一个实例对象(main screen for the device),或者是处理类的全局配置对象,这样更容易实现线程安全的方式访问共享资源,比如:配置文件,多个类同时修改配置文件的情况。


单例是一个在 Cocoa 中很常用的模式了。对于一些希望能在全局方便访问的实例,或者在 app 的生命周期中只应该存在一个的对象,我们一般都会使用单例来存储和访问。在 Objective-C 中单例的公认的写法类似下面这样:

现在我们来理解一下我们所操作的单例的规则,有3件事情需要明白:

1):单例必须是唯一的,所以它才被称为单例。在一个应用程序的生命周期里,有且只有一个实例存在。单例的存在给我们提供了一个唯一的全局状态。比如我们熟悉的NSNotification,UIApplication和NSUserDefaults都是单例。

2):为了保持一个单例的唯一性,单例的构造器必须是私有的。这防止其他对象也能创建出单例类的实例。

3):为了确保单例在应用程序的整个生命周期是唯一的,它就必须是线程安全的。当你一想到并发肯定一阵恶心,简单来说,如果你写单例的方式是错误的,就有可能会有两个线程尝试在同一时间初始化同一个单例,这样你就有潜在的风险得到两个不同的单例。这就意味着我们需要用GCD的dispatch_once来确保初始化单例的代码在运行时只执行一次。


下面是 swift 实现单例的几种方式:

1、

2、

3、


4、经常使用的方式

class Singleton {
    static let sharedInstance = Singleton()
    //This prevents others from using the default '()' initializer for this class.
    private init {}
}


注意:

单例模式很容易被过度使用。当我们遇到一些情况,准备尝试使用单例的时候,首先应该考虑使用其它的方式实现任务。例如:单例并不适用于你在两个视图控制器之间尝试传递值,相反你应该使用属性或者在构造器中传入模型,或者使用代理,闭包等方式。

如果你确定需要使用单例,应该考虑是否单例的加入有更大的意义。1、是否超过一个实例将会导致问题?是否使用自定义实例将更加有益?当你思考之后,你的答案将决定是否使用单例。

另外使用单例是很难进行测试的,这一点需要注意



参考:

The Right way to write a Singleton


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值