OC中的单例设计模式及单例的宏抽取
// 在一个对象需要重复使用,并且很频繁时,可以对对象使用单例设计模式
// 单例的设计其实就是多alloc内部的allocWithZone下手,重写该方法 #pragma Person.h文件 #import <Foundation/Foundation.h>
@interface Person : NSObject <NSCopying,NSMutableCopying>
+ (instancetype)sharePerson; // 给类提供一个创建单例对象的类工厂方法
@end #pragma Person.m文件 //
// Person.m
// 单例设计
//
// Created by 康生 邱 on 15/11/26.
// Copyright (c) 2015年 康生 邱. All rights reserved.
// #import "Person.h" @implementation Person + (instancetype)sharePerson
{
Person *instance = [[self alloc] init]; // 单例设计可以从alloc内的allocWithZone方法下手
return instance;
}
static Person *_instance = nil;
// 该方法决定了每次创建出来的是否是同一块存储空间的地址
+ (instancetype)allocWithZone:(struct _NSZone *)zone
{
// 如果_instance 等于nil,那么就调用父类的alocWithZone来创建一个对象、初始化后赋值给它
if (_instance == nil) {
_instance = [[super allocWithZone:zone] init];
} // 如果_instance 不等于nil,即已经指向了对象,那么直接返回地址即可,这样新创建的对象也指向同一个地址的对象
return _instance;
} - (id)copyWithZone:(NSZone *)zone
{
// copy是由对象调用的,在单例中对象已存在,就不需要创建对象了,直接返回对象指针即可
return _instance;
} - (id)mutableCopyWithZone:(NSZone *)zone
{
// mutableCopy和copy一样,直接返回对象指针就可以
return _instance;
} // 如果在MRC中,还需要重写release、retain、retainCount
- (oneway void)release
{
// 为了保证单例对象在程序结束前不被释放,\
这里什么都不写
}
- (instancetype)retain
{
// 直接返回单例对象地址
return _instance;
}
- (NSUInteger)retainCount
{
// 可以返回一个特殊的值,以提醒其他程序员
// return MAXFLOAT;
return UINT64_MAX;
} @end #pragma - 对单例模式的宏抽取
// 新建一个头文件(Singleton.h) // 可以使用interfaceSingleton替换掉Person类单例类工厂方法声明
#define interfaceSingleton(name) +(instancetype)share##name; // 如果当前工程在ARC下
#if __has_feature(objc_arc)
// ARC
#define implementationSingleton(name) \
+ (instancetype)share##name \
{\
name *instance = [[self alloc] init];\
return instance;\
}\
static name *_instance = nil;\
+ (instancetype)allocWithZone:(struct _NSZone *)zone\
{\
if (_instance == nil) {\
_instance = [[super allocWithZone:zone] init];\
}\
return _instance;\
}\
- (id)copyWithZone:(NSZone *)zone\
{\
return _instance;\
}\
- (id)mutableCopyWithZone:(NSZone *)zone\
{\
return _instance;\
}
#else
// MRC
#define implementationSingleton(name) \
+ (instancetype)share##name \
{\
name *instance = [[self alloc] init];\
return instance;\
}\
static name *_instance = nil;\
+ (instancetype)allocWithZone:(struct _NSZone *)zone\
{\
if (_instance == nil) {\
_instance = [[super allocWithZone:zone] init];\
}\
return _instance;\
}\
- (id)copyWithZone:(NSZone *)zone\
{\
return _instance;\
}\
- (id)mutableCopyWithZone:(NSZone *)zone\
{\
return _instance;\
}\
- (oneway void)release\
{\
}\
- (instancetype)retain\
{\
return _instance;\
}\
- (NSUInteger)retainCount\
{\
return MAXFLOAT;\
}
// 结束条件编译
#endif 通过将单例模式相关代码抽取成一个头文件,以后在类中只要导入待头文件,并传入类名即可 #pragma - 单例宏抽取后的Person.h文件 #import <Foundation/Foundation.h>
#import "Singleton.h"
@interface Person : NSObject <NSCopying,NSMutableCopying> interfaceSingleton(Person) // 宏定义,编译时会把宏名替换成+ (instancetype)sharePerson;
// 参数的传递是告诉宏替换成方法声明的时间share后面是什么名称 @end #pragma - 单例宏抽取后的Person.m文件 #import "Person.h" @implementation Person // 通过宏定义,给实现文件中的代码取别名,在实现中直接写好宏名+ 当前的类名就行了
implementationSingleton(Person)
@end
OC中的单例设计模式及单例的宏抽取的更多相关文章
- Java单例设计模式和多例设计模式
单例设计模型 教学视频链接:https://edu.aliyun.com/course/1011 1,private不可以在类外部访问,但可以在内部访问 2,此时Singleton类内部的instan ...
- java设计模式之单例设计模式和多例设计模式
单例设计模式:构造方法私有化,在类的内部定义static属性和方法,利用static方法来取得本类的实例化对象:无论外部产生多少个实例化对象,本质上只有一个实例化对象 饿汉式单例设计 class Si ...
- OC中两种单例实现方式
OC中两种单例实现方式 写在前面 前两天探索了一下C++ 的单例,领悟深刻了许多.今天来看看OC中的单例又是怎么回事.查看相关资料,发现在OC中一般有两种实现单例的方式,一种方式是跟C++ 中类似的常 ...
- java笔记之静态修饰附和单例设计模式
第六天笔记 静态修饰符static: 一.static修饰成员变量: static用来修饰成员变量叫静态成员变量,没有static修饰的成员变量叫非静态成员变量 静态成员的访问方式: (1) 用 ...
- Java面试 - 什么是单例设计模式,为什么要使用单例设计模式,如何实现单例设计模式(饿汉式和懒汉式)?
什么是单例设计模式? 单例设计模式就是一种控制实例化对象个数的设计模式. 为什么要使用单例设计模式? 使用单例设计模式可以节省内存空间,提高性能.因为很多情况下,有些类是不需要重复产生对象的. 如果重 ...
- java软件设计模式只单例设计模式
概述 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计 ...
- 菜鸡的Java笔记 第二十九 - java 单例设计模式
SingleCase 单例设计模式 1.单例设计模式的特点 2.多例设计模式的特点 内容 单例设计模式 现在如果说有这么一个程序类 class S ...
- iOS 中的单例设计模式
单例设计模式:在它的核心结构中只包含一个被称为单例类的特殊类.例如文件管理中的NSUserDefault,应用程序中的UIApplication,整个应用程序就这一个单例类,负责应用程序的一些操作,单 ...
- OC中的单例
概念 单例模式的意图是类的对象称为系统中唯一的实例,提供一个访问点,供客户类共享资源 什么情况下使用单例 )类只能由一个实例,而且必须从一个为人熟知的访问点对其进行访问,比如工厂方法 )这个唯一的实例 ...
随机推荐
- Netty4.0学习笔记系列之三:构建简单的http服务(转)
http://blog.csdn.net/u013252773/article/details/21254257 本文主要介绍如何通过Netty构建一个简单的http服务. 想要实现的目的是: 1.C ...
- NodeJS制作爬虫全过程
这篇文章主要介绍了NodeJS制作爬虫的全过程,包括项目建立,目标网站分析.使用superagent获取源数据.使用cheerio解析.使用eventproxy来并发抓取每个主题的内容等方面,有需要的 ...
- Curling 2.0(dfs)
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8795 Accepted: 3692 Description On Pl ...
- bzoj3438
很容易想到是最小割模型首先对于一个点i,从s到i连一条容量为ai的边,再从i连一条容量为bi的边到t然后就是处理附加权的问题了一开始受到之前的思维定势的影响,一直在思考怎么在作物之间连边由于每种额外收 ...
- hdu-4612-Warm up(边双连通分量--有重边)
题意:有N 个点,M条边,加一条边,求割边最少.(有重边) 分析:先求双连通分量,缩点形成一个生成树,然后求这个的直径,割边-直径即是答案 因为有的图上可能有重边,这样不好处理.我们记录每条边的标号( ...
- (转载)PHP静态方法
(转载)Lamp兄弟连PHP 6.静态方法(static修饰的方法),不能访问非静态成员(在非静态的方法中,可以访问静态成员).因为非静态的成员,就必须用对象来访问,访问内部的成员使用的就是$this ...
- 【STL】【模拟】Codeforces 696A Lorenzo Von Matterhorn
题目链接: http://codeforces.com/problemset/problem/696/A 题目大意: 一个满二叉树,深度无限,节点顺序编号,k的儿子是k+k和k+k+1,一开始树上的边 ...
- 关于DocumentCompleted事件
关于DocumentCompleted事件,MSDN给出的解释是在文档加载完毕后执行,但是在我的程序中DocumentCompleted却被多次调用,查了一下资料,大概出现了以下几种情况. 1.Web ...
- DIV+CSS布局问题:一个宽度不确定的DIV里面放三个水平对齐的DIV,左右两个DIV宽度固定为150px,中间那个DIV充满剩余的宽度
一个入门的DIV+CSS布局问题:一个宽度不确定的DIV里面放三个水平对齐的DIV,左右两个DIV宽度固定为150px,中间那个DIV充满剩余的宽度. 说明:代码非真实情况下使用,所以直接简单. 没耐 ...
- CodeForces 689C Mike and Chocolate Thieves
题目链接:http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=412145 题目大意:给定一个数字n,问能不能求得一个最小的整 ...