白羽
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
您输入的评论内容中包含违禁敏感词
我知道了

请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号