单例是iOS开发中经常会用到的一种设计模式,顾名思义,即创建一个类,该类在整个程序的生命周期中只有一个实例对象,无论是通过new,alloc init,copy等方法创建,或者创建多少个对象,自始至终在内存中只会开辟一块空间,直到程序结束,由系统释放.

如下图用不同的方式创建6个对象,但通过打印其内存地址,我们可以发现它们是共享同一块内存空间的.

由于在平时开发中经常用到,所以我将创建单例的方法定义成宏,并封装成一个工具类,提供了一个类方法来快速创建1个单例对象;

并且此类的单例包括了在MRC模式下的创建方式,保证了在MRC模式下,仍能使用该工具类来快速创建1个单例对象;

该工具类使用非常方便,只需在需要用到的类中导入头文件即可,以下是实现代码:

 //
// YYSharedModelTool.h
// SharedModel
//
// Created by Arvin on 15/12/21.
// Copyright © 2015年 Arvin. All rights reserved.
// #ifndef YYSharedModelTool_h
#define YYSharedModelTool_h // .h 文件
// ##: 在宏中,表示拼接前后字符串
#define YYSharedModelTool_H(className) + (instancetype)shared##className; #if __has_feature(objc_arc) // ARC 环境 // .m 文件
#define YYSharedModelTool_M(className)\
/****ARC 环境下实现单例的方法****/\
+ (instancetype)shared##className {\
return [[self alloc] init];\
}\
\
- (id)copyWithZone:(nullable NSZone *)zone {\
return self;\
}\
\
+ (instancetype)allocWithZone:(struct _NSZone *)zone {\
static id instance;\
static dispatch_once_t onceToken;\
dispatch_once(&onceToken, ^{\
instance = [super allocWithZone:zone];\
});\
return instance;\
} #else // MRC 环境 // .m 文件
#define YYSharedModelTool_M(className)\
\
+ (instancetype)shared##className {\
return [[self alloc] init];\
}\
\
- (id)copyWithZone:(nullable NSZone *)zone {\
return self;\
}\
\
+ (instancetype)allocWithZone:(struct _NSZone *)zone {\
static id instance;\
static dispatch_once_t onceToken;\
dispatch_once(&onceToken, ^{\
instance = [super allocWithZone:zone];\
});\
return instance;\
}\
/****MRC 环境需要重写下面3个方法****/\
- (oneway void)release {\
\
}\
- (instancetype)retain {\
return self;\
}\
- (instancetype)autorelease {\
return self;\
} #endif #endif /* YYSharedModelTool_h */

END! 欢迎留言交流,一起学习...

Objective-C中的单例模式(工具类)的更多相关文章

  1. JAVA中封装JSONUtils工具类及使用

    在JAVA中用json-lib-2.3-jdk15.jar包中提供了JSONObject和JSONArray基类,用于JSON的序列化和反序列化的操作.但是我们更习惯将其进一步封装,达到更好的重用. ...

  2. commons-lang3-3.2.jar中的常用工具类的使用

    这个包中的很多工具类可以简化我们的操作,在这里简单的研究其中的几个工具类的使用. 1.StringUtils工具类 可以判断是否是空串,是否为null,默认值设置等操作: /** * StringUt ...

  3. Android 中替代 sharedpreferences 工具类的实现

    Android 中替代 sharedpreferences 工具类的实现 背景 想必大家一定用过 sharedpreferences 吧!就我个人而言,特别讨厌每次 put 完数据还要 commit. ...

  4. 实用篇:说说我在JavaScript项目中使用的工具类

    在JavaScript的开发中,我们都会写一些工具类来帮我们简化一些业务操作的逻辑,一下就貼几个我在项目开发过程中常用的工具类.表达能力有限,各位看官还是看源码吧. 一.日期处理工具类. /** * ...

  5. java编程中的断言工具类(org.springframework.util.Assert)

    转自:https://blog.csdn.net/gokeiryou263/article/details/19612471 断言工具类:Assert类, java.lang.Object ---&g ...

  6. Java 中的并发工具类

    Java 中的并发工具类 CountDownLatch public class JoinCountDownLatchTest { public static void main(String[] a ...

  7. DateHandler日期处理工具(JSP中使用后台工具类)

    1.DateHandler.java package Utils.dateHandler; import java.text.ParseException; import java.text.Simp ...

  8. java中常用的工具类(三)

    继续分享java中常用的一些工具类.前两篇的文章中有人评论使用Apache 的lang包和IO包,或者Google的Guava库.后续的我会加上的!谢谢支持IT江湖 一.连接数据库的综合类       ...

  9. java中常用的工具类(二)

    下面继续分享java中常用的一些工具类,希望给大家带来帮助! 1.FtpUtil           Java   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...

随机推荐

  1. [转]Windows与Linux系统下的库文件介绍

    什么是库   库文件是一些预先编译好的函数的集合,那些函数都是按照可再使用的原则编写的.它们通常由一组互相关联的用来完成某项常见工作的函数构成,从本质上来说库是一种可执行代码的二进制形式,可以被操作系 ...

  2. sublime3 ctl+b无效

    Preference->Browse Packages->python,编辑Python.sublime-build文件,在字典里添加path item,value为你的python路径, ...

  3. php 之 分页查询的使用方法及其类的封装

    一.分页的使用: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://ww ...

  4. python生成html文件浏览器中文显示乱码问题

    近来在网上采集数据,想把采集下来的数据整合成html的形式保存.以便其他的平台产品可以直接读取html显示或者根据html标签提取数据. def output_html(self): try: fou ...

  5. Python番外 事务 那些事

    Transaction 也就是所谓的事务了,通俗理解就是一件事情.从小,父母就教育我们,做事情要有始有终,不能半途而废. 事务也是这样,不能做一般就不做了,要么做完,要么就不做.也就是说,事务必须是一 ...

  6. Linux下的管道命令有这些:

    Linux下的管道命令有这些: 选取命令:cat grep 排序命令:sort wc uniq 双向重定向:tee 字符转换命令: tr, col, join, paste, expand 切割命令: ...

  7. python登陆教务管理系统

    想试着模拟登陆一些网站,这次先拿学校的教务管理系统练练手,写一下登陆的流程. 1.我们登陆的url:http://222.195.8.201,但我们所填的密码不是提交到这个页面上去,检查一下页面代码 ...

  8. 跨域Ajax请求 web.config文件配置

    在web.config文件的<system.webServer>节点下面添加如下配置代码:<!--允许跨域ajax访问--> <httpProtocol> < ...

  9. Codeforces 596D Wilbur and Trees

    http://codeforces.com/contest/596/problem/D 题目大意: 有n棵树排成一排,高度都为h. 主人公要去砍树,每次等概率地随机选择没倒的树中最左边的树或者最右边的 ...

  10. Codeforces 573B Bear and Blocks

    http://codeforces.com/problemset/problem/573/B  题目大意: 给出n个连续塔,每个塔有高度hi,每次取走最外层的块,问需要多少次操作能够拿光所有的块. 思 ...