ARC和MRC 兼容的单例模式
| 一、ARC下的单例实现 |
说明:在用户实例化的方法控制单次执行,同时开放单例的初始化方法。

-(instancetype)init{
self=[super init];
if(self){
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
});
}
return self;
}
static id instance;
+(instancetype)allocWithZone:(struct _NSZone *)zone{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance=[super allocWithZone:zone];
});
return instance;
}
+ (instancetype) shareAudio{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance=[[self alloc]init];
});
return instance;
}
+(id)copyWithZone:(struct _NSZone *)zone{
return instance;
}

| 二、MRC下的单例实现 |
说明:在用户实例化的方法控制单次执行,同时开放单例的初始化方法,由于当前为MRC所以需要控制参内存管理的方法单次执行,因此相比ARC需要增加:

static id instance;
+(instancetype)allocWithZone:(struct _NSZone *)zone{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance=[super allocWithZone:zone];
});
return instance;
} + (instancetype) shareAudio{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance=[[self alloc]init];
});
return instance;
}
-(oneway void)release{
} -(instancetype)autorelease{
return instance;
} -(instancetype)retain{
return instance;
} -(NSUInteger)retainCount{
return 1;
}

| 三、兼容MRC 和ARC的宏定义 |
说明:为了方便后期的引用,可以将单例抽取为宏定义,鉴于抽取的时候考虑到当前的手动计数和自动计数因此引入条件编译:

#if !__has_feature(objc_arc)
======当前是ARC
#else
======当前是MRC
#endif 代码:
#define singleton_h(name) + (instancetype) share##name; #if !__has_feature(objc_arc)
#define singleton_m(name)\
static id instance;\
+(instancetype)allocWithZone:(struct _NSZone *)zone{\
static dispatch_once_t onceToken;\
dispatch_once(&onceToken, ^{\
instance=[super allocWithZone:zone];\
});\
return instance;\
}\
\
\
+ (instancetype) share##name{\
static dispatch_once_t onceToken;\
dispatch_once(&onceToken, ^{\
instance=[[self alloc]init];\
});\
return instance;\
}\
-(oneway void)release{\
}\
\
-(instancetype)autorelease{\
return instance;\
}\
\
-(instancetype)retain{\
return instance;\
}\
\
+(id)copyWithZone:(struct _NSZone *)zone{\
return instance;\
}\
-(NSUInteger)retainCount{\
return 1;\
} #else #define singleton_m(name)\
static id instance;\
+(instancetype)allocWithZone:(struct _NSZone *)zone{\
static dispatch_once_t onceToken;\
dispatch_once(&onceToken, ^{\
instance=[super allocWithZone:zone];\
});\
return instance;\
}\
\
\
+ (instancetype) share##name{\
static dispatch_once_t onceToken;\
dispatch_once(&onceToken, ^{\
instance=[[self alloc]init];\
});\
return instance;\
}\
\
+(id)copyWithZone:(struct _NSZone *)zone{\
return instance;\
}
#endif

| 四、文件引用 |
1 在.h文件引用singleton_h(audio);
2 在.m文件引用singleton_m(audio);
ARC和MRC 兼容的单例模式的更多相关文章
- ARC和MRC兼容和转换
1.ARC模式下如何兼容非ARC的类 转变为非ARC -fno-objc-arc 转变为ARC的, -f-objc-arc (不常用) 2.如何将MRC转换为ARC
- 单例模式 - GCD 、兼容ARC和MRC
单例模式 - GCD .兼容ARC和MRC 单例模式的作用: 1,能够保证在程序执行过程.一个类仅仅有一个实例,并且该实例易于供外界訪问 2,从而方便地控制了实例个数,并节约系统资源 单例模式的使用场 ...
- iOS开发ARC与MRC下单例的完整写法与通用宏定义
#import "XMGTool.h" /** * 1:ARC下的完整的单例写法:alloc内部会调用+(instancetype)allocWithZone:(struct _N ...
- ARC以及MRC中setter方法
ARC以及MRC中setter方法的差异 有时候,你会需要重写setter或者getter方法,你知道么,ARC与MRC的setter方法是有着差异的呢. 先看下MRC下的setter方法: 在看下A ...
- ARC 和 MRC 小结
ARC 和 MRC 内存管理 从 MRC—>ARC 就是将内存管理部分,从开发者的函数中转移到函数外部的runtime 中.由于 runtime 的开发简单,逻辑层次高,所以 runtime 的 ...
- ARC、MRC混编
Xcode5之后,新建iOS工程,默认都是ARC模式,但是有时候我们的项目中需要用到一些第三方框架,我们下载下来却发现是非ARC的,这时候我们需要进行ARC和MRC混编. 第一种方式: Edit-&g ...
- iOS内存管理 ARC与MRC
想驾驭一门语言,首先要掌握它的内存管理特性.iOS开发经历了MRC到ARC的过程,下面就记录一下本人对iOS内存管理方面的一些理解. 说到iOS开发,肯定离不开objective-c语言(以下简称OC ...
- DES加密(支持ARC与MRC)
DES加密(支持ARC与MRC) 源文件: YXCrypto.h 与 YXCrypto.m // // YXCrypto.h // 用秘钥给字符串加密或者解密 // // Created by You ...
- ARC以及MRC中setter方法的差异
ARC以及MRC中setter方法的差异 有时候,你会需要重写setter或者getter方法,你知道么,ARC与MRC的setter方法是有着差异的呢. 先看下MRC下的setter方法: 在看下A ...
随机推荐
- if else 与switch case判断
基础数据类型(四类八种 ) 不能为null. 整数型 byte 取值范围2的8次方 short 取值范围2的16次方 int 取值范围2的32次方 一般用int long 取值范围2的64次方 浮点型 ...
- js实现日期格式化
<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta http-e ...
- jQuery知识点整合
一.jQuery介绍 jQuery是一个函数库,一个js文件,页面用script标签引入js文件就可以使用 <script type="text/javascript" sr ...
- Ambari架构原理
不多说,直接上干货! Ambari 架构原理图 通过三张图来说明: 第一张架构图告诉我们:Ambari是Hortonworks贡献给社区的.完全开源的.Hadoop生态的集群管理.监控.部署的工具: ...
- 安装Scala-2.11.7——集群学习日记
前言 在安装Spark之前,我们需要安装Scala语言的支持.在此我选择的是scala-2.11.7版本. scala-2.11.7下载 为了方便,我现在我的SparkMaster主机上先安装,把目录 ...
- JMeterPluginsCMD Command Line Tool
There is small command-line utility for generating graphs out of JTL files. It behave just like righ ...
- vs2015数据驱动的单元测试
今天在做测试的时候boss让我这个菜鸟做vs2015下c#的单元测试,并且给了我参考http://www.cnblogs.com/kingmoon/archive/2011/05/13/2045278 ...
- easyUI日期框返回到月份,选择日期也只到月份
easyUI日期框返回到月份,选择日期也只到月份,不是原创,引用了园友的一篇文章,自己写下来,以便不时之需,谢谢. 1 $(function () { $('#date').datebox({ onS ...
- salesforce零基础学习(七十五)浅谈SOSL(Salesforce Object Search Language)
在工作中,我们更多操作的是一个表的对象,所以我们对SOQL的使用很多.但是有时候,我们需要对几个表进行查询操作,类似salesforce的全局搜索功能,这时,使用SOQL没法满足功能了,我们就需要使用 ...
- log4j(七)——log4j.xml简单配置样例说明
一:测试环境与log4j(一)--为什么要使用log4j?一样,这里不再重述 二:老规矩,先来个栗子,然后再聊聊感受 (1)这里栗子有一点特别呀!给出了包名唉!想必有用,是的,配置文件中要特别说明一下 ...