单例模式:
 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. NYOJ 158 省赛来了

    省赛来了 时间限制:1000 ms  |  内存限制:65535 KB 难度: 描写叙述 一年一度的河南省程序设计大赛又要来了. 竞赛是要组队的,组队形式:三人为一队,设队长一名.队员两名. 如今问题 ...

  2. c++中拷贝构造函数,浅拷贝和深拷贝的区别

    在C++提供了一种特殊的构造函数,称为拷贝构造函数.拷贝构造函数具有一般构造函数的所有特性,其作用是使用一个已经存在的对象(由拷贝构造函数的参数指定的对象)去初始化一个新的同类对象,即完成本类对象的复 ...

  3. 初探active mq

    mq(message queue),即消息队列,目前比较流行消息队列是active mq 和kafka.本文介绍如何简单的使用active mq. ActiveMQ官网下载地址:http://acti ...

  4. 使用OnScrollListener回调处理自己主动载入很多其它

    首先来分析下OnScrollListener的回调. new OnScrollListener() { boolean isLastRow = false; @Override public void ...

  5. ZOJ 3962 E.Seven Segment Display / The 14th Zhejiang Provincial Collegiate Programming Contest Sponsored by TuSimple E.数位dp

    Seven Segment Display Time Limit: 1 Second      Memory Limit: 65536 KB A seven segment display, or s ...

  6. 大括号对struct进行初始化

    1 partial initialization 即所谓的部分初始化. 这个时候,无论该struct变量是static的还是automic的,未显式初始化的成员都会被初始化为默认值.

  7. ABAP doi 导出程序

    PERFORM FRM_OUTPUT_EXCEL_38 TABLES GT_RESULT USING 'ZHRPA038' LDF_PATH . FORM FRM_OUTPUT_EXCEL_38 TA ...

  8. 设计模式-(11)组合模式 (swift版)

    一,概念 组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及整体层次.这种类型的设计模式属于结 ...

  9. manacher求最长回文子串算法

    原文:http://www.felix021.com/blog/read.php?2040 首先用一个非常巧妙的方式,将所有可能的奇数/偶数长度的回文子串都转换成了奇数长度:在每个字符的两边都插入一个 ...

  10. hdu5410(完全背包变形)

    这是道完全背包,关键点在于如何处理每种物品,第一次放时,价值为A+B,以后放时,价值为A. 所以有三种决策,对于第i种物品,要么不放,要么是作为第一个放,要么是第二个以后放. 作为第一个放时,需要用到 ...