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/ 
本文版权归烟台杰瑞教育科技有限公司和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/545096.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

scala 函数中嵌套函数_Scala中的嵌套函数 用法和示例

scala 函数中嵌套函数Scala中的嵌套函数 (Nested functions in Scala) A nested function is defined as a function which is defined inside the definition of another function. Programming languages like c, java, etc do not support nested functions but Scala does.…

Spring Boot集成Redis,这个坑把我害惨了!

最近项目中使用SpringBoot集成Redis,踩到了一个坑:从Redis中获取数据为null,但实际上Redis中是存在对应的数据的。是什么原因导致此坑的呢?本文就带大家从SpringBoot集成Redis、所踩的坑以及自动配置源码分析来学习一下SpringBoot…

www(apache)服务器的基本设置

1、安装yum install httpdyum install mysql-server*yum install mysql-develyum install phpyum install php-develyum install php-mysql2、httpd 和 mysql 的启动停止a、httpd/etc/init.d/httpd start/etc/init.d/httpd stop注:Apache自行提供一个script&#xf…

数据分析告诉你为什么Apple Watch会大卖?

摘要: 不管是无敌创意还是无聊鸡肋,苹果手表还是来了。眼下它上市在即,将率先登陆9个国家或地区——包括中国。根据凌晨发布会上公布的内容,Apple Watch采用全新的压感触屏和蓝宝石镜面,能够记录健康数据、同步手机信息 ...不管是…

putc函数_C语言中的putc()函数与示例

putc函数C语言中的putc()函数 (putc() function in C) The putc() function is defined in the <stdio.h> header file. putc()函数在<stdio.h>头文件中定义。 Prototype: 原型&#xff1a; int putc(const char ch, FILE *filename);Parameters: const char ch,…

编程中的21个坑,你占几个?

前言最近看了某客时间的《Java业务开发常见错误100例》&#xff0c;再结合平时踩的一些代码坑&#xff0c;写写总结&#xff0c;希望对大家有帮助&#xff0c;感谢阅读~1. 六类典型空指针问题包装类型的空指针问题级联调用的空指针问题Equals方法左边的空指针问题ConcurrentHas…

单词:131209

N&#xff1a; Acting 表演、演艺界 Cooperative 合作企业 Images 影像、图像 Information 信息 Projects 项目、工程 Role 角色、作用 Technology 技术 Victims 受害人 Characters 人物、性格 Desire 渴望、欲望 Diversity 多样性 Escape 逃走&#xff0c;逃脱 P…

Yii 2 美化 url

在使用 yii 1.x 中&#xff0c;我们都知道美化 url 是在配置文件中进行配置&#xff0c;那其实在 yii 2.x 中也还是一样的&#xff0c;只是配置的值不同了而已&#xff0c;接下来我们就看看如何在 yii 2.x 中美化 url 打开 config\web.php, 在 components 这个大数组里面添加以…

java timezone_Java TimeZone getAvailableIDs()方法与示例

java timezoneTimeZone类的getAvailableIDs()方法 (TimeZone Class getAvailableIDs() method) Syntax: 句法&#xff1a; public static String [] getAvailableIDs()public static String [] getAvailableIDs(int r_off);getAvailableIDs() method is available in java.uti…

Mybatis使用的9种设计模式,真是太有用了

crazyant.net/2022.html虽然我们都知道有26个设计模式&#xff0c;但是大多停留在概念层面&#xff0c;真实开发中很少遇到&#xff0c;Mybatis源码中使用了大量的设计模式&#xff0c;阅读源码并观察设计模式在其中的应用&#xff0c;能够更深入的理解设计模式。Mybatis至少遇…

Android 禁止屏幕旋转 旋转屏幕时保持Activity内容

Android 禁止屏幕旋转 & 旋转屏幕时保持Activity内容 1.在应用中固定屏幕方向。 在AndroidManifest.xml的activity中加入: android:screenOrientation”landscape” 属性即可(landscape是横向&#xff0c;portrait是纵向)。 OK 2.随屏幕旋转时&a…

Java PushbackInputStream skip()方法与示例

PushbackInputStream类skip()方法 (PushbackInputStream Class skip() method) skip() method is available in java.io package. skip()方法在java.io包中可用。 skip() method is used to skip the given number of bytes of content from this PushbackInputStream. When th…

jsp页面传中文到action中乱码问题

在用jspstruts2做个网站时&#xff0c;当要直接传中文字符到action中的方法总是出现乱码&#xff0c;在网上试了一些方法没有达到效果&#xff0c;一下两种方法是本人用过不会出现乱码的。 方法一&#xff1a;public void setSingerGender(String singerGender) {try {this.sin…

Java 生成随机数的 5 种方式,你知道几种?

1. Math.random() 静态方法产生的随机数是 0 - 1 之间的一个 double&#xff0c;即 0 < random < 1。使用&#xff1a;for (int i 0; i < 10; i) {System.out.println(Math.random()); }结果&#xff1a;0.3598613895606426 0.2666778145365811 0.25090731064243355 …

linux进程的管理,显示及杀死

ps 命令是用来查看目前系统中&#xff0c;有哪些正在执行&#xff0c;以及他们的执行情况。可以不加任何参数。 显示详细的进程信息1、ps -a&#xff1a;意思是说显示当前终端的所有进程信息2、ps -u&#xff1a;以用户的格式显示进程信息3、ps -x&#xff1a;显示后台进程运行…

Java OutputStreamWriter flush()方法与示例

OutputStreamWriter类flush()方法 (OutputStreamWriter Class flush() method) flush() method is available in java.io package. flush()方法在java.io包中可用。 flush() method is used to flush this stream. flush()方法用于刷新此流。 flush() method is a non-static m…

percona-toolkit工具包的使用教程

percona-toolkit工具包的使用教程之介绍和安装http://blog.chinaunix.net/uid-20639775-id-3206802.htmlpercona-toolkit工具包的使用教程之开发工具类使用http://blog.chinaunix.net/uid-20639775-id-3207926.htmlpercona-toolkit工具包的使用教程之性能类工具http://blog.chi…

MySQL为Null会导致5个问题,个个致命!

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;正式开始之前&#xff0c;我们先来看下 MySQL 服务器的配置和版本号信息&#xff0c;如下图所示&#xff1a;“兵马未动粮草…

任务调度的使用crontab

任务调度的使用crontab1、设置任务crontab -e2、每隔一定时间去执行 date > /home/mydate11&#xff09;希望&#xff0c;每天凌晨2&#xff1a;00去执行 date >> /home/mydate2可以再crontab -e中加入0 2 * * * date >> /home/mydate22&#xff09;希望每分钟去…

sql 存储过程返回值 变量名

return 语句返回值&#xff0c;前台调用的参数名称为 RETURN_VALUE