蓝懿 iOS 单例的线程安全

在多线程中,单例的实现也要考虑线程安全问题。

1.通过GCD dispatch_once来实现:

@property (nonatomic, strong) NSString *str;
- (NSString *)str {
	static dispatch_once_t onceToken;
	dispatch_once(&onceToken, ^{
		if (!_str) {
			_str = [[NSString alloc] init];
		}
	});
	return _str;
}

当然这是在ARC情况下,如果是MRC情况下str被释放了,那么再访问str时会应用崩溃,被释放的内存,野指针,因为dispatch_once确实只执行一次。

而下面代码就不同了。

- (NSString *)str {
	if (!_str) {
		@synchronized(self) {
			if (!_str) {
				_str = [[NSString alloc] init];
			}
		}
	}
	return _str;
}
时间: 2024-12-14 21:05:33

蓝懿 iOS 单例的线程安全的相关文章

蓝懿 iOS iOS单例销毁

1 单例的实现见之前写过的一篇文章 iOS单例的快速实现 static InstanceClass *instance; + (InstanceClass *)defaultInstance{ @synchronized (self){ if (instance == nil) { instance = [[InstanceClass alloc] init]; } } return instance;} 2 单例的概念复习下 单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而

iOS单例创建的一点疑惑

线程安全的单例常用写法, +(AccountManager *)sharedManager{ static AccountManager *defaultManager = nil; disptch_once_t once; disptch_once(&once,^{ defaultManager = [[self alloc] init]; }); return defaultManager; } 在用的过程中,有点疑惑的点是:static AccountManager *defaultMan

iOS 单例

iOS 单例 1.官方文档写法 static AccountManager *DefaultManager = nil; + (AccountManager *)defaultManager { if (!DefaultManager) DefaultManager = [[self allocWithZone:NULL] init]; return DefaultManager; } 2.来自 objcolumnist + (AccountManager *)sharedManager { s

iOS 单例(Singleton)总结 和第三库引用单例

引用:http://blog.csdn.net/lovefqing/article/details/8516536#t3 http://blog.csdn.net/kindazrael/article/details/7917863 单例模式用于当一个类只能有一个实例的时候, 通常情况下这个“单例”代表的是某一个物理设备比如打印机,或是某种不可以有多个实例同时存在的虚拟资源或是系统属性比如一个程序的某个引擎或是数据.最简单的一个例子是,当用户打开QQ空间播放音乐的时候,这里就是一个单例,如果不是

ios单例的实现

单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 这里主要介绍下在arc下,利用gcd实现单例. 第一步:声明一个静态实例 static SoundTool *_instance; 第二步:重写初始化方法 + (id)allocWithZone:(struct _NSZone *)zone 在对象初始化分配内存的时候都会调用这个方法,重写该方法时,即便用户没用通过shared方法获取实例,自己初始化依然可以保证得到的是同一个实例. 在gcd后,多线程下保证一个代码只被执

iOS单例宏

先别急,先简单提一下单列的概念,当然具体的描述可能仁者见仁智者见智了! 1.单例设计模式(Singleton) 1> 什么是单列: 它可以保证某个类创建出来的对象永远只有1个 2> 作用(为什么要用) 节省内存开销 如果有一些数据, 整个程序中都用得上, 只需要使用同一份资源(保证大家访问的数据是相同的,一致的) 一般来说, 工具类设计为单例模式比较合适 3> 怎么实现,老程序员是碰到这样的问题的!arc下就少了! MRC(非ARC) ARC 废话少说,先来看一下我的单例模式下的头文件!

#在蓝懿iOS学习的日子#

#在蓝懿iOS学习的日子#昨天我们学习了让uiimaag,学习了如何的插入图片,学习如何让它上下左右移动,其实就是加入按钮buttonon来控制图片的方向,还学习让图片在一定的范围内来回的移动,最后还制作了一个简易的游戏,我们都称之为简易的反射器,在下方设立一个按钮,发射一个图片,打击上方左右移动的image,为胜利,并以打中一次,来进行计分,难点就是两个图片的碰撞,设立的放h是这样的: //设置luobo与tu1障碍物的碰撞 //frame是指图片的矩形,进行碰撞 if (CGRectInte

iOS单例写法简析

官方文档这样写的: static AccountManager *DefaultManager = nil; + (AccountManager *)defaultManager { if (!DefaultManager) DefaultManager = [[self allocWithZone:NULL] init]; return DefaultManager; } 在iOS4之后有了另外一种写法: + (AccountManager *)sharedManager { static A

iOS单例

ios之单例模式 原帖地址:http://www.galloway.me.uk/tutorials/singleton-classes/ 本文为博主自行翻译,转载请注明出处:http://blog.csdn.net/iosevanhuang/article/details/13278323 “单例模式”是我在iOS中最常使用的设计模式之一.单例模式不需要传递任何参数,就有效地解决了不同代码间的数据共享问题. 背景 单例类是一个非常重要的概念,因为它们表现出了一种十分有用的设计模式.单例类的应用贯