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实现单例模式的几种实现方法

1.经典方法 static CUser * gUser = nil; +(id)currentUser { if(gUser == nil) gUser = [[self...
  • th_gsb
  • th_gsb
  • 2015年07月06日 13:53
  • 4493

单例模式的五种实现方式

单例模式可以说是23中设计模式中应用最广的一种模式了。        定义:确保某一个类只有一个实例,自行实例化并且想整个系统提供这个实例。       使用场景:避免某个类产生多个对象而消耗过多...
  • soul_code
  • soul_code
  • 2015年12月05日 09:53
  • 8622

iOS 各种单例写法、详解

转自: http://2015.iteye.com/blog/1122130 C代码   @implementation AppShareDataManager     ...
  • wxs0124
  • wxs0124
  • 2016年02月29日 22:42
  • 1057

设计模式——单例模式的几种实现方式

1.饿汉式:静态常量 这种方法非常的简单,因为单例的实例被声明成static和final变量了,在第一次加载类到内存中时就会初始化,所以会创建实例本身是线程安全的。public class Singl...
  • bingogirl
  • bingogirl
  • 2016年09月01日 00:03
  • 1271

IOS多线程实现方式

IOS应用开发中我们可以使用如下san 1.、NSThread  2、Cocoa NSOperation (iOS多线程编程之NSOperation和NSOperationQueue的使用) 3、GC...
  • pingchangtan367
  • pingchangtan367
  • 2014年07月24日 15:05
  • 9665

单例模式的6种实现方式

为什么使用单例模式需要确保某个类只要一个对象,或创建一个类需要消耗的资源过多,如访问IO和数据库操作等,这时就需要考虑使用单例模式了。使用单例模式需要注意的关键点 将构造函数访问修饰符设置为priva...
  • ts1900
  • ts1900
  • 2016年05月13日 16:03
  • 1647

单例模式在iOS中的应用——三种创建单例方法对比

单例模式优点 单例模式在内存中只有一个实例,减少了内存开支。特别是一个对象需要频繁的创建、销毁时,而创建与销毁的性能有无法优化,单例模式的优势就非常明显。单例模式只生成一个实例,减少了系统性能开...
  • quanzheng92
  • quanzheng92
  • 2014年11月10日 21:22
  • 1625

实现单例的几种方式

方法1:很经典的,也是用的很多的。
  • zhangjianbo1989
  • zhangjianbo1989
  • 2014年08月04日 17:41
  • 262

Java的两种动态代理方式

动态代理指被代理者委托代理者完成相应的功能,是拦截器的一种实现方式,其用于拦截类或接口,内部可通过判断实现对某个方法的拦截。   jdk方式,委托类必须实现接口,代理类只能对接口进行代理。使用jav...
  • zilong0536
  • zilong0536
  • 2016年11月12日 17:28
  • 1141

单例的几种实现方式

单例模式的定义: 单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在。 许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,...
  • m0_38110132
  • m0_38110132
  • 2017年07月06日 17:01
  • 112
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ios学习--单例实现的几种方式
举报原因:
原因补充:

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