Objective-C中的单例模式(工具类)
单例是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中的单例模式(工具类)的更多相关文章
- JAVA中封装JSONUtils工具类及使用
在JAVA中用json-lib-2.3-jdk15.jar包中提供了JSONObject和JSONArray基类,用于JSON的序列化和反序列化的操作.但是我们更习惯将其进一步封装,达到更好的重用. ...
- commons-lang3-3.2.jar中的常用工具类的使用
这个包中的很多工具类可以简化我们的操作,在这里简单的研究其中的几个工具类的使用. 1.StringUtils工具类 可以判断是否是空串,是否为null,默认值设置等操作: /** * StringUt ...
- Android 中替代 sharedpreferences 工具类的实现
Android 中替代 sharedpreferences 工具类的实现 背景 想必大家一定用过 sharedpreferences 吧!就我个人而言,特别讨厌每次 put 完数据还要 commit. ...
- 实用篇:说说我在JavaScript项目中使用的工具类
在JavaScript的开发中,我们都会写一些工具类来帮我们简化一些业务操作的逻辑,一下就貼几个我在项目开发过程中常用的工具类.表达能力有限,各位看官还是看源码吧. 一.日期处理工具类. /** * ...
- java编程中的断言工具类(org.springframework.util.Assert)
转自:https://blog.csdn.net/gokeiryou263/article/details/19612471 断言工具类:Assert类, java.lang.Object ---&g ...
- Java 中的并发工具类
Java 中的并发工具类 CountDownLatch public class JoinCountDownLatchTest { public static void main(String[] a ...
- DateHandler日期处理工具(JSP中使用后台工具类)
1.DateHandler.java package Utils.dateHandler; import java.text.ParseException; import java.text.Simp ...
- java中常用的工具类(三)
继续分享java中常用的一些工具类.前两篇的文章中有人评论使用Apache 的lang包和IO包,或者Google的Guava库.后续的我会加上的!谢谢支持IT江湖 一.连接数据库的综合类 ...
- java中常用的工具类(二)
下面继续分享java中常用的一些工具类,希望给大家带来帮助! 1.FtpUtil Java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...
随机推荐
- UI基础视图----UIView总结
UIView是UIKit框架里面最基础的视图类,是UIResponder的子类,是UIApplication和UIViewController的兄弟类,是UIWindow,UILabel,UIImag ...
- 数据库元数据分析Demo
核心类:DatabaseMetaData.ResultSetMetaData 1 System.err.println("********************************** ...
- js基本类型
1.undefined 1)var a;//没有赋值的时候就是undefined 2)undefined派生自null,alert(undefined==null)//true 虽然这上条语句是一样, ...
- IE6、火狐不支持a:visited
今天做个样式,想让超链接点击后变成灰色,可发现IE里是没问题,可火狐就全灰色的.我测试了好几遍,发现不是顺序的问题.当然可以在火狐里地址栏里输入about:config.可总不能让用户去那里改吧.以下 ...
- dede分页
{dede:list pagesize ='} <div class="intro clearfix"> <ul class="pic"> ...
- 百度PHP实习一面面试题-算法-二维有序矩阵的查找
题目描述 有一个二维矩阵,每一行的元素,从左到右保持严格递增,每一列的元素,从上到下保持严格递增.查找给定元素elem,返回NULL或元素位置. 1 3 7 15 16 2 5 8 17 19 3 6 ...
- “DataTable”是“System.Data.DataTable”和“Microsoft.Office.Interop.Excel.DataTable”之间的不明确的引用
“DataTable”是“System.Data.DataTable”和“Microsoft.Office.Interop.Excel.DataTable”之间的不明确的引用 造成这个错误的原因是,在 ...
- C语言初学 数学中带根号的复杂计算问题
#include<stdio.h> #include<math.h> int main() { double a,b; scanf("%lf%lf",&am ...
- Ruby的语法糖
发现Ruby的语法糖好多,比如函数调用,参数列表可以写括号和不写括号.代码块可以用do end 或者 {}. 还有 if,unless后置.等等. 如果看Ruby代码看多了,你会发现,它很多地方的 ...
- linux磁盘限额配置:quota命令
LINUX下也有类似WINDOWS NTFS所用的磁盘限额,用的是quota来实现通过rpm -q quota确定是否已安装用quota只能对patation做限额,要做到针对某个目录来做只能靠ln ...