单例对象

在开发中经常需要使用单例对象。今天主要说的是单例宏

首先先简单介绍一下

1.单例设计模式(Singleton)

1> 什么: 它可以保证某个类创建出来的对象永远只有1个

2> 作用(为什么要用)

* 节省内存开销

* 如果有一些数据, 整个程序中都用得上, 只需要使用同一份资源(保证大家访问的数据是相同的,一致的)

* 一般来说, 工具类设计为单例模式比较合适

3> 怎么实现

* MRC(非ARC)

* ARC

代码采用的是mrc的环境

单独创建一个.h文件 例如SingleTon.h

 1 //帮助实现单例设计模式
 2 /*
 3  alloc方法内部会调用allocWithZone
 4  */
 5 
 6 #define SingletonH(methodName) +(instancetype)shared##methodName;
 7 
 8 #if __has_feature(objc_arc)//是arc
 9 
10 #define SingletonM(methodName)\
11 static id _instance = nil;\
12 \
13 +(instancetype)allocWithZone:(struct _NSZone *)zone\
14 {\
15     \
16     if(_instance == nil)\
17     {\
18         static dispatch_once_t onceToken;\
19         dispatch_once(&onceToken, ^{\
20             _instance = [super allocWithZone:zone];\
21         });\
22     }\
23     return _instance;\
24 }\
25 +(instancetype)shared##methodName\
26 {\
27     return [[self alloc]init];\
28 }\
29 
30 #else//不是arc
31 
32 #define SingletonM(methodName)\
33 static id _instance = nil;\
34 \
35 +(instancetype)allocWithZone:(struct _NSZone *)zone\
36 {\
37 \
38 if(_instance == nil)\
39 {\
40 static dispatch_once_t onceToken;\
41 dispatch_once(&onceToken, ^{\
42 _instance = [super allocWithZone:zone];\
43 });\
44 }\
45 return _instance;\
46 }\
47 -(oneway void)release\
48 {\
49 \
50 }\
51 \
52 -(instancetype)retain\
53 {\
54 return self;\
55 }\
56 -(NSUInteger)retainCount\
57 {\
58 return 1;\
59 }\
60 +(instancetype)shared##methodName\
61 {\
62 return [[self alloc]init];\
63 }
64 
65 #endif

\代表的含义是说:下一行属于它  

然后在使用的时候

soundTool.h文件

#import <Foundation/Foundation.h>
#import "singleTon.h"
@interface soundTool : NSObject
SingletonH(sound)
@end

 soundTool.m文件

#import "soundTool.h"

@implementation soundTool
//注意里边的方法名不要跟类名相同(大小写都不行得)
SingletonM(sound)

@end

然后在controller.m文件中

- (void)viewDidLoad {
    [super viewDidLoad];
    dataTool *d1 = [dataTool shareddatatools];
    dataTool *d2 = [dataTool shareddatatools];
    soundTool *s1 = [soundTool sharedsound];
    soundTool *s2 = [soundTool sharedsound];
    NSLog(@"%p %p ",d1,d2);
    NSLog(@"%p %p ",s1,s2);

 这样就能报保证多个类都是单例的

有时候 出现mrc 跟arc 混编的状况  

这样的话在个别的文件  的配置文件中追加 -fobjc-arc (说明是arc文件)

还有时候可能碰见这样的代码

 //补充
    NSArray *array = [[NSArray alloc]init];
    //判断如果不是arc状态的话  进行array的释放
    #if !__has_feature(objc_arc)
        [array release];
    #endif

 这个说明判断如果不是arc环境的话 就要对array进行释放

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏deepcc

sublime text2之js压缩-Js Minifier

396130
来自专栏移动端周边技术扩展

iOS信号量处理异步请求中的同步处理

39750
来自专栏君赏技术博客

【已解决】Framework 框架需要引入工程里面类

为了提高工程的编译速度,准备把第三方库编译成 Framework。这样就可以省掉编译这些第三方库的很多时间了。

15230
来自专栏老司机的简书

老司机出品———疯狂造轮子之图片异步下载类

SDWebImage,我估计没有一个做iOS的不知道这个三方库吧,他为我们提供了简洁的图片异步下载方式。在他为我一句api带来这么大便利的同时,你有没有想过他是...

13540
来自专栏ShaoYL

归档

34360
来自专栏DannyHoo的专栏

iOS中存储图片到相册中的两种方式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/...

1.4K10
来自专栏哈雷彗星撞地球

iOS开发中WiFi相关功能总结

查漏补缺集是自己曾经做过相关的功能,但是重做相关功能或者重新看到相关功能的实现,感觉理解上更深刻。这一类的文章集中记录在查漏补缺集。

39240
来自专栏iOS技术

iOS多线程应用(一):概述、NSThread

现在网络上有着大量的关于多线程的文章,“深入剖析”、“底层原理”这些看似高大上的字眼很多,然而大部分文章完全没达到那个地步,仅仅是使用API的水平,关键是还有很...

35360
来自专栏进击的程序猿

swoole入门abc1. 入门abc

分析上面的代码,我们发现会有什么问题?如果两个请求同时进来,都读到了lastTime,没有被拒绝,但是这两个请求本身是已经请求过快了。

10420
来自专栏积累沉淀

CXF 框架拦截器

CXF的拦截器 •为什么设计拦截器? 1.为了在webservice请求过程中,能动态操作请求和响应数据, CXF设计了拦截器. •拦截器分类: 1...

20960

扫码关注云+社区

领取腾讯云代金券