iOS单例模式实现
来源:互联网 发布:淘宝美工作品图片大全 编辑:程序博客网 时间:2024/06/13 23:14
参考文章:
1、http://beyondvincent.com/blog/2013/05/09/20/
2、《ios设计模式解析》
iOS中,单例模式的实现方式一般有两种:Non-ARC(非ARC)和ARC+GCD (建议采用ARC+GCD模式)
(一)Non-ARC实现方法如下:
SYWNonARCSingleton.h
#import <Foundation/Foundation.h>
@interface SYWNonARCSingleton :NSObject
+(SYWNonARCSingleton *)sharedInstance;
@end
SYWNonARCSingleton.m
/**
参考文档:1、Cocoa Fundamentals Guide
2、http://beyondvincent.com/blog/2013/05/09/20/
*/
#import "SYWNonARCSingleton.h"
@implementation SYWNonARCSingleton
staticSYWNonARCSingleton *sharedInstance = nil;
/** 版本1
功能:获取一个sharedInstance实例,如果有必要的话,实例化一个
说明:这种非ARC实现单例的方法,不是线程安全的。因为,如果有多个线程同时调用sharedInstance,而sharedInstance方法需要花费1-2秒钟的时间,
那么,SYWNonARCSingleton的init方法可能会被多次调用,即,不同的线程获得的SYWNonARCSingleton实例可能不是同一个。解决方法:使用@synchronized来创建互斥锁
*/
/**
+(SYWNonARCSingleton *)sharedInstance
{
if (sharedInstance == nil) {
sharedInstance = [[super allocWithZone:NULL] init];
}
return sharedInstance;
}
*/
/** 版本2
功能:获取一个SYWNonARCSingleton的实例
*/
+(SYWNonARCSingleton *)sharedInstance
{
//保证在实例化的时候是线程安全的,但,不能保证,单例中所有方法的调用都是线程安全的。
@synchronized(self){
if (sharedInstance ==nil) {
sharedInstance = [[superallocWithZone:NULL]init];
}
}
returnsharedInstance;
}
/**版本3
说明:这个版本,在子类化单例的时候,应该最有效。
*/
/**
+(SYWNonARCSingleton *)sharedInstance
{
@synchronized(self){
if (sharedInstance == nil) {
sharedInstance = [NSAllocateObject([self class], 0, NULL) init];
}
}
return sharedInstance;
}
*/
- (id)init
{
self = [superinit];
if (self) {
//通常在这里做一些相关的初始化任务
}
return self;
}
//这个dealloc方法不会被调用,以为,在程序的生命周期内,该单例一直都存在
- (void)dealloc
{
[superdealloc];
}
//通过返回当前的sharedInstance实例,就能防止实例化一个新的对象
+(id)allocWithZone:(struct_NSZone *)zone
{
return [[selfsharedInstance] retain];
}
//不希望生成单例的多个拷贝
+(id)copyWithZone:(struct_NSZone *)zone
{
return self;
}
- (id)copy
{
return self;
}
- (id)retain
{
return self;
}
- (NSUInteger)retainCount
{
returnNSUIntegerMax;
}
//该方法是空的,因为,不希望用户release掉这个对象
- (onewayvoid)release
{
}
- (id)autorelease
{
return self;
}
@end
SYWARCSingleton.h
#import <Foundation/Foundation.h>
@interface SYWARCSingleton :NSObject
+(SYWARCSingleton *)sharedInstance;
@end
SYWARCSingleton.m
#define DEFINE_SHARED_INSTANCE_USING_BLOCK(block)\
static dispatch_once_t onceToken = 0;\
__strong static id sharedInstance = nil;\
dispatch_once(&onceToken,^{\
sharedInstance = block();\
});\
return sharedInstance;\
#import "SYWARCSingleton.h"
@implementation SYWARCSingleton
+(SYWARCSingleton *)sharedInstance
{
static SYWARCSingleton *sharedInstance =nil;
static dispatch_once_t onceToken;//锁
dispatch_once(&onceToken, ^{
sharedInstance = [[selfalloc] init];
});
return sharedInstance;
}
//在ARC中,不用GCD也可以做到线程安全,即,使用@synchronized
/**
+(SYWARCSingleton *)sharedInstance
{
static SYWARCSingleton *sharedInstance = nil;
@synchronized(self){
sharedInstance = [[self alloc] init];
}
return sharedInstance;
}
*/
- (id)init
{
self = [superinit];
if (self) {
//通常在这里做一些相关的初始化任务
}
return self;
}
@end
- iOS单例模式实现
- iOS 单例模式实现
- iOS 单例模式实现
- iOS单例模式的实现
- iOS singleton单例模式的实现
- iOS单例模式的实现
- iOS单例模式的实现
- iOS单例模式的实现
- iOS单例模式的实现
- iOS单例模式的实现
- iOS单例模式的实现
- iOS单例模式的实现
- iOS单例模式的实现
- iOS单例模式的实现
- ios单例模式的实现
- 需求:ios单例模式实现
- ios单例模式的实现
- iOS中的单例模式的实现
- Symmetric Tree----easy
- Head First Python(推导数据)
- mac 启动nexus
- Atitit.ide代码块折叠插件 eclipse
- Android开发之InstanceState详解
- iOS单例模式实现
- C#定义全局变量,可以在各个窗体中使用
- python多线程的简单使用
- Edit Distance----hard
- 后DIY时代,再谈超频
- 机器学习实战(第一章)---KNN算法
- Objective-C学习笔记(一)-准备工作
- 【汇编指令】ARM指令集之寄存器及32位概述
- 大数阶乘