适用于ARC & MRC

 

 // 帮助实现单例设计模式

 // .h文件的实现
 #define SingletonH(methodName) + (instancetype)shared##methodName;

 // .m文件的实现
 #if __has_feature(objc_arc) // 是ARC
 #define SingletonM(methodName) \
 static id _instace = nil; \
 + (id)allocWithZone:(struct _NSZone *)zone \
 { \
 if (_instace == nil) { \
 static dispatch_once_t onceToken; \
 dispatch_once(&onceToken, ^{ \
 _instace = [super allocWithZone:zone]; \
 }); \
 } \
 return _instace; \
 } \
 \
 - (id)init \
 { \
 static dispatch_once_t onceToken; \
 dispatch_once(&onceToken, ^{ \
 _instace = [super init]; \
 }); \
 return _instace; \
 } \
 \
 + (instancetype)shared##methodName \
 { \
 return [[self alloc] init]; \
 } \
 + (id)copyWithZone:(struct _NSZone *)zone \
 { \
 return _instace; \
 } \
 \
 + (id)mutableCopyWithZone:(struct _NSZone *)zone \
 { \
 return _instace; \
 }

 #else // 不是ARC

 #define SingletonM(methodName) \
 static id _instace = nil; \
 + (id)allocWithZone:(struct _NSZone *)zone \
 { \
 if (_instace == nil) { \
 static dispatch_once_t onceToken; \
 dispatch_once(&onceToken, ^{ \
 _instace = [super allocWithZone:zone]; \
 }); \
 } \
 return _instace; \
 } \
 \
 - (id)init \
 { \
 static dispatch_once_t onceToken; \
 dispatch_once(&onceToken, ^{ \
 _instace = [super init]; \
 }); \
 return _instace; \
 } \
 \
 + (instancetype)shared##methodName \
 { \
 return [[self alloc] init]; \
 } \
 \
 - (oneway void)release \
 { \
 \
 } \
 \
 - (id)retain \
 { \
 return self; \
 } \
 \
 - (NSUInteger)retainCount \
 { \
 ; \
 } \
 + (id)copyWithZone:(struct _NSZone *)zone \
 { \
     return _instace; \
 } \
  \
 + (id)mutableCopyWithZone:(struct _NSZone *)zone \
 { \
     return _instace; \
 }

 #endif

 OC 使用(arc)

直接复制到一个.h文件即可,例如singleton.h

 使用方式:

  1> 导入头文件 #import "singleton.h"

  2> 在 .h 中 直接使用

    SingletonH(methodName) -----> 类似于   + (instancetype)sharedmethodName 方法

  3> 在.h 中直接使用

    SingletonM(methodName) -----> 就相当于实现了

    •    + (instancetype)sharedmethodName 
    •      + (id)allocWithZone:(struct _NSZone *)zone
    •      - (id)init

  注意: 此种方式, shared 的方式 和 allock 的方式,都只会创建一个单例对象

【iOS开发】单例模式设计(ARC & MRC)的更多相关文章

  1. iOS开发--单例模式

    单例模式在iOS开发中可能算是最常用的模式之一了,但是由于oc本身的语言特性,想要写一个正确的单例模式相对来说比较麻烦,这里我就抛砖引玉来聊一聊iOS中单例模式的设计思路.关于单例模式更多的介绍请参考 ...

  2. iOS开发单例模式 dispatch_once

    什么是单例 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源 ...

  3. iOS开发-单例模式的解读

    现在网上的有很多人写单例模式,一个很基本的东西但是版本也有很多,新人看了难免有些眼花缭乱的感觉.自己最新比较闲,也过来写一些自己的心得. 在往下看之前,我们要明白一点,那就是在什么情况下我们才要用到单 ...

  4. iOS开发中的 ARC

    1. weak属性(弱引用) 被weak修饰的对象叫弱引用,不算对象持有者,一个方法执行完后会导致这个对象自动释放掉,并将对象的指针设置成nil,我使用GCD延时1000ms来验证,1000ms之后, ...

  5. iOS 开发,混合使用 ARC 和非ARC

    [前提知识] ARC:Automatic Reference Counting,自动引用计数 在开发 iOS 3 以及之前的版本的项目时我们要自己负责使用引用计数来管理内存,比如要手动 retain. ...

  6. iOS开发——OC基础-ARC、BLOCK、协议

    一.ARC ARC 是一种编译器特性!而不是IOS运行时特性,和JAVA中得垃圾回收机制完全不一样ARC是自iOS 5之后增加的新特性,完全消除了手动管理内存的烦琐,编译器会自动在适当的地方插入适当的 ...

  7. iOS开发,用了ARC,引入非ARC的第三方,报错

    ARC forbids explicit message sendof'dealloc' 在xcode中,打开“Build Setting”,找到“Objective-C Automatic Refe ...

  8. 【iOS开发】在ARC项目中使用非ARC文件

    ARC的出现应该说是开发者的一大福利,苹果是推荐使用的,但是因为之前没有ARC机制,好多比较好的类库都是使用的非ARC,或是有些大牛还是不喜欢用ARC,封装的类也是非ARC的,想要在自己的ARC项目中 ...

  9. iOS开发——单例模式

    一.用if语句实现单例 1.在.h文件中 #import <Foundation/Foundation.h> @interface YYTRequestTool : NSObject +( ...

随机推荐

  1. spring动画-iOS-备

    最后停止在终点: 如果给位置移动的动画添加弹簧效果,那么视图的运动轨迹应该像下图中展现的一样: 这会使你的动画看起来更逼真.更真实.更贴近现实.在某些情况下带给用户更好的用户体验.那么让我们开始学习吧 ...

  2. forEach遍历对象数组案例

    <script> var users = [ {name:'name1',age:21}, {name:'name2',age:22}, {name:'name3',age:23} ]; ...

  3. Android扩展 - 拍照篇(Camera)

    1.调用系统摄像头 1.声明常量和变量 2.按钮点击事件,打开系统摄像头 3.重写onActivityResult事件接收拍照返回 4.生成文件名返回路径 5.保存图片 private static  ...

  4. IComparer<T> 接口Linq比较接口

    IComparer<T>比较两个对象并返回一个值,指示一个对象是小于.等于还是大于另一个对象. 在Linq当中,很多扩展方法接受一个实现IComparer<T>接口的实例的对象 ...

  5. bzoj 1189

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1189 这道题目看起来好像要用很高端的网络流. 这道题有一个特别之处,就是每一个空地都有人,不是 ...

  6. 关于overload和override

    override 覆盖,表示在子类中一个函数覆盖基类中的同名函数,或者局部的某个函数覆盖了全局的某个同名函数.被覆盖的函数通常不能直接被调用,必须借助一些显式的强制手段. overload 重载,表示 ...

  7. Thinkphp显示系统常量信息的方法(php的用法)

    输入 :public function Main()    {        dump(get_defined_constants(true));    }显示系统信息, 其中: 'APP_PATH' ...

  8. CSS3 div水平、垂直居中,IE9以上、Firefox、Chrome均正常

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  9. 原生 javascript 学习之 js变量

    1.变量的命名 方法的命名(驼峰命名法) 全部小写 : 单词与单词之间全部下划线 (my_namespace) 大小写混合 : 第一个单词首字母小写其他单词首字母大写. 规则 首字符 英文字母或下划线 ...

  10. SSH 服务启动时出现如下错误:fatal: Cannot bind any address

    注意:本文相关配置及说明已在 CentOS 6.5 64 位操作系统中进行过测试.其它类型及版本操作系统配置可能有所差异,具体情况请参阅相应操作系统官方文档. 问题描述 云服务器 ECS (Elast ...