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 ...
随机推荐
- (转载)Oracle10g 数据泵导出命令 expdp 使用总结(一)
原文链接:http://hi.baidu.com/edeed/item/890626ef6f6d9d265b2d646f Oracle10g 数据泵导出命令 expdp 使用总结(二)Oracle10 ...
- ssh自动化出现的莫名报错
代码如: ssh -q user@host <<EOF localhost EOF 会出现提示如: Pseudo-terminal will not be allocated becaus ...
- ThinkPhp框架:分页查询和补充框架知识
上一篇的随笔写的是基本操作,现在可以做一些高级操作,例如有条件的查询数据,有分页的条件查询数据 一.一个条件的查询数据 查询数据自然是先要显示出数据,然后根据条件进行查询数据 (1)显示出表的数据 这 ...
- TCP常见的定时器三次握手与四次挥手
1.TCP常见的定时器 在TCP协议中有的时候需要定期或者按照某个算法对某个事件进行触发,那么这个时候,TCP协议是使用定时器进行实现的.在TCP中,会有七种定时器: 建立连接定时器(connecti ...
- 用Node.JS+MongoDB搭建个人博客(app.js接口文件)(二)
app.js的GitHub地址:用力戳我然后点个star 说个题外话,THINKPHP是通过一个index.php来引入文件,所以被称为接口文件. 而NodeJS也有这样的接口文件,通常也会放在根目录 ...
- Linux,activemq-cpp之消息过滤器
假设过滤器字符串如下: filt1=aaaa filt2=bbbb filt3=cccc activeMQ-cpp中消息过滤器,在发送消息的producer.cpp中,对message进行属性设置,m ...
- 初始jvm(一)---jvm内存区域与溢出
jvm内存区域与溢出 为什么学习jvm 木板原理,最短的一块板决定一个水的深度,当一个系统垃圾收集成为瓶颈的时候,那么就需要你对jvm的了解掌握. 当一个系统出现内存溢出,内存泄露的时候,因为你懂jv ...
- (转)Spring Bean Scope 有状态的Bean 无状态的Bean
有状态会话bean :每个用户有自己特有的一个实例,在用户的生存期内,bean保持了用户的信息,即“有状态”:一旦用户灭亡(调用结束或实例结束),bean的生命期也告结束.即每个用户最初都会得到一 ...
- JVM GC(整理)
1 GC类型 1 )YGC 一般情况下,当新对象生成,并且在Eden申请空间失败时,就好触发YGC ,堆Eden区域进行GC,清除非存活对象,并且把尚且存活的对象移动到Survivor区.然后整理S ...
- Verilog HDL常用综合语法
前面已经记录了一些组成Verilog的基本组成,可以用这些基本组成来构成表达式.这一节,就来记录一下把这些表达式构成一个文件的各种行为描述语句. ①这里用Verilog基本要素进行的行为描述主要是针对 ...