日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ARC和MRC 兼容的单例模式

發布時間:2025/3/8 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 兼容的单例模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。