单例模式:
 1.永远只分配一块内存来创建对象
 2.提供一个类方法, 返回内部唯一的一个对象(一个实例)
 3.最好保证init方法也只初始化一次

写一个宏定义文件,传入宏定义函数名,自动生成符合类名的单例函数名:

ARC下单例的常规写法(代码中的\是宏定义的写法):

  1. static id _instance;
  2. + (id)allocWithZone:(struct _NSZone *)zone
  3. {
  4. static dispatch_once_t onceToken;
  5. dispatch_once(&onceToken, ^{
  6. _instance = [super allocWithZone:zone];
  7. });
  8. return _instance;
  9. }
  10.  
  11. + (instancetype)shared##name
  12. {
  13. static dispatch_once_t onceToken;
  14. dispatch_once(&onceToken, ^{
  15. _instance = [[self alloc] init];
  16. });
  17. return _instance;
  18. }
  19. + (id)copyWithZone:(struct _NSZone *)zone
  20. {
  21. return _instance;
  22. }

MRC写法:

  1. static id _instance; \
  2. + (id)allocWithZone:(struct _NSZone *)zone \
  3. { \
  4. static dispatch_once_t onceToken; \
  5. dispatch_once(&onceToken, ^{ \
  6. _instance = [super allocWithZone:zone]; \
  7. }); \
  8. return _instance; \
  9. } \
  10. \
  11. + (instancetype)shared##name \
  12. { \
  13. static dispatch_once_t onceToken; \
  14. dispatch_once(&onceToken, ^{ \
  15. _instance = [[self alloc] init]; \
  16. }); \
  17. return _instance; \
  18. } \
  19. \
  20. - (oneway void)release \
  21. { \
  22. \
  23. } \
  24. \
  25. - (id)autorelease \
  26. { \
  27. return _instance; \
  28. } \
  29. \
  30. - (id)retain \
  31. { \
  32. return _instance; \
  33. } \
  34. \
  35. - (NSUInteger)retainCount \
  36. { \
  37. return ; \
  38. } \
  39. \
  40. + (id)copyWithZone:(struct _NSZone *)zone \
  41. { \
  42. return _instance; \
  43. }

宏在单例类中的用法(.h文件):

宏在单例类中的用法(.m文件):

很明显,极大的精简了单例的写法,提高了代码的复用价值。

具体使用效果:

对象的地址打印:

工作中用到单例,每次重写烦不胜烦。理解了单例的作用和写法,不妨试试这个宏定义,也可以提出修改共同进步

github的下载地址

完美单例宏定义(兼容ARC和MRC),项目中可以直接使用的更多相关文章

  1. iOS单例 宏定义

    #define singleton_interface(className) \ + (className *)shared##className; // @implementation #defin ...

  2. 单例模式 - GCD 、兼容ARC和MRC

    单例模式 - GCD .兼容ARC和MRC 单例模式的作用: 1,能够保证在程序执行过程.一个类仅仅有一个实例,并且该实例易于供外界訪问 2,从而方便地控制了实例个数,并节约系统资源 单例模式的使用场 ...

  3. iOS- 封装单例宏

    在项目中,我们需要全局只有一个实例,节省不必要的内存,这时我们就需要使用里单例生成对象. 这时把单例的代码封装成宏,就能方便我们下次使用了. 在.h .m里直接导入头文件,调用 传入类名即可! sin ...

  4. iOS快速单例宏

    // 单例 #define DECLARE_SHARED_INSTANCE(className) \ + (className *)sharedInstance; #define IMPLEMENT_ ...

  5. Unity小白文——单例的定义

    当类继承与MonoBehaviour时 public class TestSingle : MonoBehaviour { public static TestSingle Instance; voi ...

  6. c++ 宏定义声明类,并在类中实现回调

    #include <iostream> #include <windows.h> #include <string> using namespace std; ty ...

  7. iOS-ARC项目使用非ARC文件 MRC项目使用ARC文件

    SDK4.0引入了ARC,到现在已经好几年了,开始发现有很多项目会混合使用这两个方案.比如: 1.自己的旧项目没有使用ARC,但是引入的第三方库却是使用了ARC的. 2.自己的新项目使用了ARC,但是 ...

  8. OC中的单例设计模式及单例的宏抽取

    // 在一个对象需要重复使用,并且很频繁时,可以对对象使用单例设计模式 // 单例的设计其实就是多alloc内部的allocWithZone下手,重写该方法 #pragma Person.h文件 #i ...

  9. Fask中的路由-模版-静态文件引用 及宏定义与表单

    文档: flask: http://docs.jinkan.org/docs/flask/quickstart.html#redirects-and-errors jinja2 http://docs ...

随机推荐

  1. 深入浅出 - Android系统移植与平台开发(十二)- Android JNI机制

    第五章.JNI机制 4.1 JNI概述 由前面基础知识可知,Android的应用层由Java语言编写,Framework框架层则是由Java代码与C/C++语言实现,之所以由两种不同的语言组合开发框架 ...

  2. js 变量、函数提升

    js 变量.函数提升 先简单理解下作用域的概念,方便对变量与函数提升的概念的理解 function foo() { var x = 1; if (x) { var x = 2; } console.l ...

  3. iOS 用xib自定义View

      网上有很多关于实现用xib自定义View,那我为什么还要写呢?第一,我用他们的方法都没有实现.第二,用xib遇到了很多问题,想分享给大家.    用xib自定义View:FHCustomView ...

  4. [办公自动化]EXCEL不大,但是保存很慢

    今天同事有一个excel文件.office 2007格式的. 折腾了半天.按照以往的经验,定位-对象,应该可以删除. 后来在“编辑”窗格的“查找和选择”里面,单击“选择窗格“.可以看到很多”pictu ...

  5. VMware一些使用心得

    这段时间VMware workstation用得较多,装了好几个虚拟机,有win2003,win2008,win7,还分32位,64位.装了这么多,要么是用于安装一些软件,比如oracle12c,因为 ...

  6. 微信企业号调用js-sdk注意事项

    企业号应用必须添加可信域名,域名必须通过备案,可以是子域名,如果网站带端口,一定也要加上端口号...踩坑记

  7. C编程中fread 、fwrite 用法总结

    在C语言中进行文件操作时,我们经常用到fread()和fwrite(),用它们来对文件进行读写操作.下面详细绍一下这两个函数的用法.   我们在用C语言编写程序时,一般使用标准文件系统,即缓冲文件系统 ...

  8. ubuntu安装ibus-goolepinyin通用方法

    1:获取安装包 http://code.google.com/p/libgooglepinyin/downloads/list

  9. (unix domain socket)使用udp发送>=128K的消息会报ENOBUFS的错误

    一个困扰我两天的问题, Google和Baidu没有找到解决方法! 此文为记录这个问题,并给出原因和解决方法. 1.Unix domain socket简介 unix域协议并不是一个实际的协议族,而是 ...

  10. zoj 3471(状态压缩DP,类似于点集配对)

    Most Powerful Time Limit: 2 Seconds      Memory Limit: 65536 KB Recently, researchers on Mars have d ...