完美单例宏定义(兼容ARC和MRC),项目中可以直接使用
单例模式:
1.永远只分配一块内存来创建对象
2.提供一个类方法, 返回内部唯一的一个对象(一个实例)
3.最好保证init方法也只初始化一次
写一个宏定义文件,传入宏定义函数名,自动生成符合类名的单例函数名:
ARC下单例的常规写法(代码中的\是宏定义的写法):
- static id _instance;
- + (id)allocWithZone:(struct _NSZone *)zone
- {
- static dispatch_once_t onceToken;
- dispatch_once(&onceToken, ^{
- _instance = [super allocWithZone:zone];
- });
- return _instance;
- }
- + (instancetype)shared##name
- {
- static dispatch_once_t onceToken;
- dispatch_once(&onceToken, ^{
- _instance = [[self alloc] init];
- });
- return _instance;
- }
- + (id)copyWithZone:(struct _NSZone *)zone
- {
- return _instance;
- }
MRC写法:
- static id _instance; \
- + (id)allocWithZone:(struct _NSZone *)zone \
- { \
- static dispatch_once_t onceToken; \
- dispatch_once(&onceToken, ^{ \
- _instance = [super allocWithZone:zone]; \
- }); \
- return _instance; \
- } \
- \
- + (instancetype)shared##name \
- { \
- static dispatch_once_t onceToken; \
- dispatch_once(&onceToken, ^{ \
- _instance = [[self alloc] init]; \
- }); \
- return _instance; \
- } \
- \
- - (oneway void)release \
- { \
- \
- } \
- \
- - (id)autorelease \
- { \
- return _instance; \
- } \
- \
- - (id)retain \
- { \
- return _instance; \
- } \
- \
- - (NSUInteger)retainCount \
- { \
- return ; \
- } \
- \
- + (id)copyWithZone:(struct _NSZone *)zone \
- { \
- return _instance; \
- }
宏在单例类中的用法(.h文件):
宏在单例类中的用法(.m文件):
很明显,极大的精简了单例的写法,提高了代码的复用价值。
具体使用效果:
对象的地址打印:
工作中用到单例,每次重写烦不胜烦。理解了单例的作用和写法,不妨试试这个宏定义,也可以提出修改共同进步
完美单例宏定义(兼容ARC和MRC),项目中可以直接使用的更多相关文章
- iOS单例 宏定义
#define singleton_interface(className) \ + (className *)shared##className; // @implementation #defin ...
- 单例模式 - GCD 、兼容ARC和MRC
单例模式 - GCD .兼容ARC和MRC 单例模式的作用: 1,能够保证在程序执行过程.一个类仅仅有一个实例,并且该实例易于供外界訪问 2,从而方便地控制了实例个数,并节约系统资源 单例模式的使用场 ...
- iOS- 封装单例宏
在项目中,我们需要全局只有一个实例,节省不必要的内存,这时我们就需要使用里单例生成对象. 这时把单例的代码封装成宏,就能方便我们下次使用了. 在.h .m里直接导入头文件,调用 传入类名即可! sin ...
- iOS快速单例宏
// 单例 #define DECLARE_SHARED_INSTANCE(className) \ + (className *)sharedInstance; #define IMPLEMENT_ ...
- Unity小白文——单例的定义
当类继承与MonoBehaviour时 public class TestSingle : MonoBehaviour { public static TestSingle Instance; voi ...
- c++ 宏定义声明类,并在类中实现回调
#include <iostream> #include <windows.h> #include <string> using namespace std; ty ...
- iOS-ARC项目使用非ARC文件 MRC项目使用ARC文件
SDK4.0引入了ARC,到现在已经好几年了,开始发现有很多项目会混合使用这两个方案.比如: 1.自己的旧项目没有使用ARC,但是引入的第三方库却是使用了ARC的. 2.自己的新项目使用了ARC,但是 ...
- OC中的单例设计模式及单例的宏抽取
// 在一个对象需要重复使用,并且很频繁时,可以对对象使用单例设计模式 // 单例的设计其实就是多alloc内部的allocWithZone下手,重写该方法 #pragma Person.h文件 #i ...
- Fask中的路由-模版-静态文件引用 及宏定义与表单
文档: flask: http://docs.jinkan.org/docs/flask/quickstart.html#redirects-and-errors jinja2 http://docs ...
随机推荐
- 深入浅出 - Android系统移植与平台开发(十二)- Android JNI机制
第五章.JNI机制 4.1 JNI概述 由前面基础知识可知,Android的应用层由Java语言编写,Framework框架层则是由Java代码与C/C++语言实现,之所以由两种不同的语言组合开发框架 ...
- js 变量、函数提升
js 变量.函数提升 先简单理解下作用域的概念,方便对变量与函数提升的概念的理解 function foo() { var x = 1; if (x) { var x = 2; } console.l ...
- iOS 用xib自定义View
网上有很多关于实现用xib自定义View,那我为什么还要写呢?第一,我用他们的方法都没有实现.第二,用xib遇到了很多问题,想分享给大家. 用xib自定义View:FHCustomView ...
- [办公自动化]EXCEL不大,但是保存很慢
今天同事有一个excel文件.office 2007格式的. 折腾了半天.按照以往的经验,定位-对象,应该可以删除. 后来在“编辑”窗格的“查找和选择”里面,单击“选择窗格“.可以看到很多”pictu ...
- VMware一些使用心得
这段时间VMware workstation用得较多,装了好几个虚拟机,有win2003,win2008,win7,还分32位,64位.装了这么多,要么是用于安装一些软件,比如oracle12c,因为 ...
- 微信企业号调用js-sdk注意事项
企业号应用必须添加可信域名,域名必须通过备案,可以是子域名,如果网站带端口,一定也要加上端口号...踩坑记
- C编程中fread 、fwrite 用法总结
在C语言中进行文件操作时,我们经常用到fread()和fwrite(),用它们来对文件进行读写操作.下面详细绍一下这两个函数的用法. 我们在用C语言编写程序时,一般使用标准文件系统,即缓冲文件系统 ...
- ubuntu安装ibus-goolepinyin通用方法
1:获取安装包 http://code.google.com/p/libgooglepinyin/downloads/list
- (unix domain socket)使用udp发送>=128K的消息会报ENOBUFS的错误
一个困扰我两天的问题, Google和Baidu没有找到解决方法! 此文为记录这个问题,并给出原因和解决方法. 1.Unix domain socket简介 unix域协议并不是一个实际的协议族,而是 ...
- zoj 3471(状态压缩DP,类似于点集配对)
Most Powerful Time Limit: 2 Seconds Memory Limit: 65536 KB Recently, researchers on Mars have d ...