ARC和MRC 兼容的单例模式
生活随笔
收集整理的這篇文章主要介紹了
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);
?
作者:杰瑞教育出處:http://www.cnblogs.com/jerehedu/?
本文版權歸煙臺杰瑞教育科技有限公司和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
總結
以上是生活随笔為你收集整理的ARC和MRC 兼容的单例模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ftp上传和下载命令
- 下一篇: 飞凌 ok6410 按键驱动源码及测试代