ios学习--单例实现的几种方式

转载 2016年06月01日 16:06:19

在 iOS 开发过程中,我们经常会用到各种单例,例如 NSFileManager,UIApplication等,这些是系统给我们提供的单例类;有很多时候由于各种各样的原因,我们自己也需要写单例;

  下面来说一下我们常用到几种单例的实现方式:

  1.第一种方式,重写+allocWithZone:方法;
  这个方法为苹果公司官方推荐的,看这里;但是苹果官方的写法中,没有互斥锁,这样并不能保证在多线程中的线程安全,所以这里我用到 @synchronized 来保证线程安全;

+(instancetype)allocWithZone:(struct _NSZone *)zone{
    static id instance = nil;
    @synchronized (self) { //为了线程安全,加上互斥锁
        if (instance == nil) {
            instance = [super allocWithZone:zone];
        }
    }
    return instance;
}

  2.第二种方式,不用重写+allocWithZone:方法,而是直接用@synchronized 来保证线程安全,其它与上面这个方法一样;

+(instancetype)sharedSingleton{
    static id instance = nil;
    @synchronized (self) {
        if (!instance) {
            instance = [[self alloc] init];
        }
    }
    return instance;
}

  3.第三种方式,通过 GCD 的 dispatch_once 来实现单例,同样可以在保证线程安全的前提下来实现单例

+(instancetype)sharedSingleton{
    static id instance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [[self alloc] init];
    });
    return instance;
}


PS:swift 单例 ,还有线程保护

static let sharedSingleton = instance()



文/TobyoTenma(简书作者)
原文链接:http://www.jianshu.com/p/a9e9d503806a
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

iOS 页面间几种传值方式(属性,代理,block,单例,通知)

第二个视图控制器如何获取第一个视图控制器的部分信息 例如 :第二个界面中的lable显示第一个界面textField中的文本 这就需要用到属性传值、block传值 那么第一个视图控制...

iOS 页面间几种传值方式(属性,代理,block,单例,通知)

第二个视图控制器如何获取第一个视图控制器的部分信息 例如 :第二个界面中的lable显示第一个界面textField中的文本 这就需要用到属性传值、block传值 那么第一个视图控制器如...
  • mrSunHR
  • mrSunHR
  • 2015年06月26日 11:19
  • 356

iOS 页面间几种传值方式(属性,代理,block,单例,通知)

第二个视图控制器如何获取第一个视图控制器的部分信息 例如 :第二个界面中的lable显示第一个界面textField中的文本 这就需要用到属性传值、block传值 那么第一个视图控制...

iOS 页面间几种传值方式(属性,代理,block,单例,通知)

第二个视图控制器如何获取第一个视图控制器的部分信息 例如 :第二个界面中的lable显示第一个界面textField中的文本 这就需要用到属性传值、block传值 那么第一个视图控制器如何获的第二个视...

iOS 页面间几种传值方式(属性,代理,block,单例,通知

iOS 页面间几种传值方式属性(KVC,KVO),代理(delegate),block,单例,通知(NSNotification)**应用场景:**第二个视图控制器如何获取第一个视图控制的信息 eg:...
  • ChinHan
  • ChinHan
  • 2015年12月03日 09:27
  • 507

单例的几种实现方式

单例模式的定义: 单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在。 许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,...

java单例的几种实现方式

1.懒汉式 线程不安全,如果两个线程同时执行到了 if (instance == null) {//这一句判断都为真,紧接着就会创建两个实例 public class Singlet...

ios 单例实现方式

在开发中经常会用到单例,它在整个程序的运行周期里面只会被创建一次,只要程序没有结束,它就不会被释放!创建单例的两种方式如下: 一、GCD方式创建单例 static id _instance; + (...

几种常见的单例的设计方式

第一种:非延迟加载单例类(饿汉式) package test; public class Singleton { private Singleton() { } priv...
  • zztp01
  • zztp01
  • 2011年08月22日 11:00
  • 362

iOS单例的创建方式

最近在iOS开发中,需要用到单例模式,于是自己动手写了一个,它看起来是这样的: + (id)sharedInstance { static id sharedInstance =...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ios学习--单例实现的几种方式
举报原因:
原因补充:

(最多只允许输入30个字)