iOS之单例

今天在看多线程同步时,突然想到了单例的同步问题。自从dispatch_once出现后,我们创建单例非常简单且安全:

1 static dispatch_once_t pred;
2 static SingleObject *sharedObject = nil;
3
4 dispatch_once(&pred, ^{
5     sharedObject = [[[self class] alloc] init];
6 });
7 return sharedObject;

苹果简洁的接口已经慢慢让我们忘记了创建单例时的同步问题。

普通的创建单例方法:

1 static SingleObject *obj = nil;
2
3 @synchronized (self) {
4     if (obj == nil) {
5         obj = [[SingleObject alloc] init];
6     }
7 }
8
9 return obj;

这么写是没问题的,但是在多个线程同时调用时效率不高,可以用著名的double check方法来提高效率:

1 static SingleObject *obj = nil;
2
3 if (obj == nil) {
4     @synchronized (self) {
5         if (obj == nil) {
6             obj = [[SingleObject alloc] init];
7         }
8     }
9 }

如果没有第一个if (obj == nil),每一次调用这个方法,都会用锁操作来实现线程同步,这是非常消耗性能的。

加上if (obj == nil)后,第二次调用这个方法,就不会在进入到锁模块的代码中,只有obj = nil时,才会进入一次锁代码,

这样能很好的提高由于锁带来的性能问题。

时间: 2024-11-13 14:05:28

iOS之单例的相关文章

IOS 定位 单例

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 + (SCLocationController *)sharedController {      static SCLocationController *sharedController = nil;     

IOS多线程--单例

单例 iOS中,如何实现一个真正的单例 单例问题最担心的就是线程安全,因为它常常被多个控制器同时访问 1.保证allocWithZone:方法是线程安全的,当调用super方法的时候使用dispatch_once方法锁住 2.保证单例实现方法也使用dispatch_once方法锁住创建对象的过程 3.dispatch_once 被广泛用在单例,缓存等代码中,用来保证只执行一次 在单线程中没有意义,但是在多线程中,其低负载,高的可依赖性,接口简单等,赢得五星好评 static dispatch_o

iOS的单例UIApplication总结及一些常见方法

UIApplication是一个应用程序的象征并且是一个单例对象 方法:openURL(打电话,发短信) // NSURL 资源唯一路径的地址// 规范:    协议头://主机地址/资源路径// 网络资源: http://www.baidu.com/image/123.png// 本地资源: file:///user/desktop/image/321.png // 状态栏交给Application管理(在系统info.plist文件中添加下面这条命令)View controller-base

iOS:创建单例对象的两种方式

单例模式:创建单例对象的两种方式 方式一:iOS4版本之前 static SingleClassManager *singleManager = nil; +(SingleClassManager*)sharedManager { @synchronized(self)  //同步加锁,在多线程中使用,可以使线程安全 { if(singleManager == nil) { singleManager = [[SingleClassManager alloc]init]; } } return

iOS设计模式 - 单例

原理图 说明 1. 单例模式人人用过,严格的单例模式很少有人用过 2. 严格的单例模式指的是无法通过常规的 alloc init 方法来生成对象,派生出来的子类也不能产生出对象,而只能通过单例的方法获取到对象 源码 https://github.com/YouXianMing/SingletonPattern // // Singleton.h // SingletonPattern // // Created by YouXianMing on 15/8/6. // Copyright (c)

ios之单例类的创建实现与使用技巧总结

首先讲下单例类能够实现的功能,也是在项目中经常可以用到的.因为单例是全局哪里要用直接调用就行非常方便简单,一般我们可以用单例来作对用户信息的存储,其次单例可以做成购物车之类的页面等等.当然单例最大的优势个人感觉就是对数据的存储和读取非常方便,就可以解决页面之间传值困难的问题.简单讲下怎样用单例对数据传输吧,把需要的数据都定义成属性,当需要存储的时候直接调用存储就行,要用的时候把它调出使用就行了这里不做过多描述了. 下面用个简单地demo来详细介绍实现过程   (工程采用非ARC模式) xcode

iOS 创建单例的方法

在ios4之后出现了一种单例的写法: 首先创建一个继承于NSObject的类 在.h文件中声明一个类方法 + (InstallStatisticsClass *)shareInstance; 在.m中将这个方法 + (InstallStatisticsClass *)shareInstance { static InstallStatisticsClass *instance = nil; static dispatch_once_t str; dispatch_once (&str,^{ in

ios oc单例宏定义

#undef AS_SINGLETON #define AS_SINGLETON( __class ) \ - (__class *)sharedInstance; \ + (__class *)sharedInstance; #undef DEF_SINGLETON #define DEF_SINGLETON( __class ) \ - (__class *)sharedInstance \ { \ return [__class sharedInstance]; \ } \ + (__cl

iOS开发-单例GCD

+ (SingletonObject *)shareInstance; + (SingletonObject *)shareInstance { static SingletonObject *__singletion; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ __singletion=[[self alloc] init]; }); return __singletion; } static dispatch