IOS开发之Objective-C在ARC下结合GCD的单例模式和宏模版
白羽 2018-06-22 来源 :网络 阅读 1355 评论 0

摘要:本文将带你了解IOS开发之Objective-C在ARC下结合GCD的单例模式和宏模版, 希望本文对大家学IOS有所帮助。




单例模式在iOS开发过程中经常用到,苹果提供过objective c单例的比较官方的写法:

[cpp] view plain copy
1. static MyGizmoClass *sharedGizmoManager = nil;  
2.    
3. + (MyGizmoClass*)sharedManager  
4. {  
5.     @synchronized(self) {  
6.         if (sharedGizmoManager == nil) {  
7.             [[self alloc] init]; // assignment not done here  
8.         }  
9.     }  
10.     return sharedGizmoManager;  
11. }  
12.    
13. + (id)allocWithZone:(NSZone *)zone  
14. {  
15.     @synchronized(self) {  
16.         if (sharedGizmoManager == nil) {  
17.             sharedGizmoManager = [super allocWithZone:zone];  
18.             return sharedGizmoManager;  // assignment and return on first allocation  
19.         }  
20.     }  
21.     return nil; //on subsequent allocation attempts return nil  
22. }  
23.    
24. - (id)copyWithZone:(NSZone *)zone  
25. {  
26.     return self;  
27. }  
28.    
29. - (id)retain  
30. {  
31.     return self;  
32. }  
33.    
34. - (unsigned)retainCount  
35. {  
36.     return UINT_MAX;  //denotes an object that cannot be released  
37. }  
38.    
39. - (void)release  
40. {  
41.     //do nothing  
42. }  
43.    
44. - (id)autorelease  
45. {  
46.     return self;  
47. }  
现在iOS5之后普遍使用了ARC技术,原来这个写法就显得很累赘了,release已经不使用了。
咱们可以结合GCD来实现单例模式:
[cpp] view plain copy
1. + (id)sharedInstance  
2. {  
3.   static dispatch_once_t pred = 0;  
4.   __strong static id _sharedObject = nil;  
5.   dispatch_once(&pred, ^{  
6.     _sharedObject = [[self alloc] init]; // or some other init method  
7.   });  
8.   return _sharedObject;  
9. }  
使用dispatch_once,这个方法的意思是在应用程序生命周期内,这方法只执行一次,这就是ARC下结合GCD的一个单例的代码
因为我们可能需要多个单例的类,每个都写一次比较麻烦,可以更方便一些,把这些代码写成宏的形式,只需要传入类名就可以创建一个单例的类了。
通过传入类名创建头文件中单例方法的名称:
[cpp] view plain copy
1. #define DEFINE_SINGLETON_FOR_HEADER(className) \  
2. \  
3. + (className *)shared##className;  
 
通过传入类名创建单例方法的实现
[cpp] view plain copy
1. #define DEFINE_SINGLETON_FOR_CLASS(className) \  
2. \  
3. + (className *)shared##className { \  
4. static className *shared##className = nil; \  
5. static dispatch_once_t onceToken; \  
6. dispatch_once(&onceToken, ^{ \  
7. shared##className = [[self alloc] init]; \  
8. }); \  
9. return shared##className; \  
10. }


使用宏:

在项目中新建了一个类testSingleton,并且有.h 和.m文件。

.h

.m中的代码:
[cpp] view plain copy
1. #import "testSingleton.h"  
2.   
3. @implementation testSingleton  
4. DEFINE_SINGLETON_FOR_CLASS(testSingleton)  
5. @end  
 
[cpp] view plain copy
1. #define DEFINE_SINGLETON_FOR_HEADER(className) \  
2. \  
3. + (className *)shared##className;  
4.   
5. #define DEFINE_SINGLETON_FOR_CLASS(className) \  
6. \  
7. + (className *)shared##className { \  
8. static className *shared##className = nil; \  
9. static dispatch_once_t onceToken; \  
10. dispatch_once(&onceToken, ^{ \  
11. shared##className = [[self alloc] init]; \  
12. }); \  
13. return shared##className; \  
14. }  
15.   
16. #import <Foundation/Foundation.h>  
17.   
18. @interface testSingleton : NSObject  
19. DEFINE_SINGLETON_FOR_HEADER(testSingleton);  
20. @end  
你可以把宏单独放到项目管理宏的文件中。这里是为了方便演示放到和testSingleton.h文件了。获取单例:
[cpp] view plain copy
1. - (void)test  
2. {  
3.     testSingleton *testShare = [testSingleton sharedtestSingleton];  
4. }


 


本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之IOS频道!


本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved