(一)什么是单例模式(Singleton)

单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点 *最初的定义是在<设计模式>(Addison-Wesley)中

解读

1>在数学与逻辑学中,Singleton的定义是:"有且只有一个元素的集合".

2>在程序中,无论以什么方式创建对象,总是放回第一次创建的对象

(二)何时使用单例模式

类只能有一个实例,并且必须从一个为人熟知的访问点对其进行访问,比如工厂方法

避免重复生成同一对象浪费内存空间

(三)实现单例模式的思想-拦截创建对象的方法,在调用创建对象的方法时,总是返回第一次创建的对象

(四)在iOS中实现单例模式的方法

1>通过GCD中的once函数来进行实现

 #import <Foundation/Foundation.h>

 @interface ZDZPerson : NSObject

 + (instancetype)sharedPerson;
@end

ZDZPerson.h

 #import "ZDZPerson.h"

 @interface ZDZPerson () <NSCopying>

 @end

 @implementation ZDZPerson

 //创建一个全局变量(目的是在整个生命周期都可以访问到)
static id _person; //调用alloc方法或其他生成对象的方法时会默认调用allocWithZone方法
+ (instancetype)allocWithZone:(struct _NSZone *)zone {
static dispatch_once_t tokenOnce;
dispatch_once(&tokenOnce, ^{
_person = [super allocWithZone:zone];
});
return _person;
} //实现此方法避免因copy对象时 产生新的对象
- (id)copyWithZone:(NSZone *)zone {
return _person;
} //自定义sharedPerson方法 返回对象
+ (instancetype)sharedPerson {
static dispatch_once_t tokenOnce;
dispatch_once(&tokenOnce, ^{
_person = [[self alloc] init];
});
return _person;
} @end

ZDZPerson.m

2>通过为线程加锁的方式实现

 #import <Foundation/Foundation.h>

 @interface ZDZAnimal : NSObject
+ (instancetype)sharedAnimal;
@end

ZDZAnimal.h

 #import "ZDZAnimal.h"

 @implementation ZDZAnimal
static id _animal; //调用alloc方法或其他生成对象的方法时会默认调用allocWithZone方法
+ (instancetype)allocWithZone:(struct _NSZone *)zone {
@synchronized(self) {
if (_animal == nil) {
_animal = [super allocWithZone:zone];
}
}
return _animal;
} //实现此方法避免因copy对象时 产生新的对象
- (id)copyWithZone:(NSZone *)zone {
return _animal;
} //自定义sharedPerson方法 返回对象
+ (instancetype)sharedAnimal {
@synchronized(self) {
_animal = [[self alloc] init];
}
return _animal;
}
@end

ZDZAnimal.m

(五)实现单例类代码的复用:通过#define来实现单例代码的复用

1>代码解读

#define kZDZSingletonH(name) + (instancetype)shared##name;  可以通过此方式动态设置函数名

扩展:

#define Conn(x,y) x##y
#define ToChar(x) #@x
#define ToString(x) #x

x##y表示什么?表示x连接y,举例说:
int n = Conn(123,456);   结果就是n=123456;
char* str = Conn("asdf", "adf")结果就是 str = "asdfadf";
怎么样,很神奇吧

再来看#@x,其实就是给x加上单引号,结果返回是一个const char。举例说:
char a = ToChar(1);结果就是a='1';
做个越界试验char a = ToChar(123);结果是a='3';
但是如果你的参数超过四个字符,编译器就给给你报错了!error C2015: too many characters in constant   :P

最后看看#x,估计你也明白了,他是给x加双引号
char* str = ToString(123132);就成了str="123132";

注:转载他人

1>工具类代码

 #define kZDZSingletonH(name) + (instancetype)shared##name;

 #define kZDZSingletonM(name)\
static id _instance;\
\
+ (instancetype)allocWithZone:(struct _NSZone *)zone {\
static dispatch_once_t tokenOnce;\
dispatch_once(&tokenOnce, ^{\
_instance = [super allocWithZone:zone];\
});\
return _instance;\
}\
\
- (id)copyWithZone:(NSZone *)zone {\
return _instance;\
}\
\
+ (instancetype)shared##name {\
static dispatch_once_t tokenOnce;\
dispatch_once(&tokenOnce, ^{\
_instance = [[self alloc] init];\
});\
return _instance;\
}

ZDZSingleton.h

2>使用方法

 #import <Foundation/Foundation.h>
#import "ZDZSingleton.h" @interface ZDZComputer : NSObject kZDZSingletonH(Computer) @end

ZDZComputer.h

 #import "ZDZComputer.h"

 @implementation ZDZComputer

 kZDZSingletonM(Computer)

 @end

ZDZComputer.m

iOS设计模式-单例模式的更多相关文章

  1. iOS设计模式——单例模式

    单例模式用于当一个类只能有一个实例的时候, 通常情况下这个“单例”代表的是某一个物理设备比如打印机,或是某种不可以有多个实例同时存在的虚拟资源或是系统属性比如一个程序的某个引擎或是数据.用单例模式加以 ...

  2. IOS设计模式之一(MVC模式,单例模式)

    iOS 设计模式-你可能已经听说过这个词,但是你真正理解它意味着什么吗?虽然大多数的开发者可能都会认为设计模式是非常重要的,然而关于设计模式这一主题的文章却不多,并且有时候我们开发者在写代码的时候也不 ...

  3. iOS设计模式(02):单例模式

    iOS设计模式(02):单例模式 singleton-design-pattern 什么是单例模式? 单例模式是一个类在系统中只有一个实例对象.通过全局的一个入口点对这个实例对象进行访问.在iOS开发 ...

  4. IOS设计模式浅析之单例模式(Singleton)

    说在前面 进入正式的设计模式交流之前,扯点闲话.我们在项目开发的过程中,经常会不经意的使用一些常见的设计模式,如单例模式.工厂方法模式.观察者模式等,以前做.NET开发的时候,认真拜读了一下程杰老师的 ...

  5. iOS书摘之Objective-C编程之道 iOS设计模式解析

    来自<Objective-C编程之道iOS设计模式解析>一书的摘要总结 一.Prototype 原型模式 定义:使用原型实例指定创建对象的种类,并通过复制这个原型创建新的对象.(<设 ...

  6. iOS 设计模式

    很赞的总结 iOS Design Patterns 中文版 IOS设计模式之一(MVC模式,单例模式) IOS设计模式之二(门面模式,装饰器模式) IOS设计模式之三(适配器模式,观察者模式) IOS ...

  7. iOS设计模式 - (1)概述

    近期可自由安排的时间比較多, iOS应用方面, 没什么好点子, 就先放下, 不写了.花点时间学学设计模式. 之后将会写一系列博文, 记录设计模式学习过程. 当然, 由于我自己是搞iOS的, 所以之后设 ...

  8. iOS 的单例模式 dispatch_once

    iOS 的单例模式 dispatch_once 有些变量仅仅须要初始化一次(如从文件里读取配置參数.读取设备型号等等),能够使用dispatch_once来进行读取优化.保证仅仅调用API一次,以后就 ...

  9. 【设计模式】Java设计模式 - 单例模式

    [设计模式]Java设计模式 - 单例模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 分享学习心得,欢迎指正,大家一起学习成长! 原创作品,更多关注我CSDN: ...

随机推荐

  1. 红黑树(三)之 Linux内核中红黑树的经典实现

    概要 前面分别介绍了红黑树的理论知识 以及 通过C语言实现了红黑树.本章继续会红黑树进行介绍,下面将Linux 内核中的红黑树单独移植出来进行测试验证.若读者对红黑树的理论知识不熟悉,建立先学习红黑树 ...

  2. debian7.1 sources.list

    deb http://mirrors.163.com/debian wheezy main non-free contribdeb http://mirrors.163.com/debian whee ...

  3. yousa_team团队项目——兼职平台网站 工作进度

    4月31 初步设计网站界面,功能以及数据库关系图 网站包括登陆注册界面,商家和学生都有个人主页,查看兼职信息界面和反馈界面,管理员有查看反馈界面,查看兼职市场,管理后台界面 登录注册界面实现用户的登陆 ...

  4. [linux]执行pip安装的程序:command not found

    执行pip安装的程序:command not found 问题描述: 我有一台阿里云服务器,上面装的是centos系统,我用pip安装好vituralenv,都没办法直接启动.同样 我今天在部署我的t ...

  5. 点餐系统mealsystem.sql

    /* Navicat MySQL Data Transfer Source Server : localhost Source Server Version : 50162 Source Host : ...

  6. DFS --- HNU 13307 Galaxy collision

    Galaxy collision Problem's Link Mean: 给定二维坐标平面内的n个整数点,让你把这n个点划分为两个集合,同一集合内的所有点必须两两距离大于5,求这两个集合的元素个数之 ...

  7. IEnumerable接口

    IEnumerable接口顾名思义就是 可枚举的,可列举的. 接口也很简单,返回一个 枚举器对象 IEnumerator . [ComVisible(true), Guid("496B0AB ...

  8. jQuery的事件one

    如果你只想你设计的对象只能让用户执行一次的话,可以使用jQuery的事件one()来实现. 演示一个,创建视图, 看看效果:

  9. WinForm公共控件

    公共控件:1.Button:按钮 用户点击时触发事件 行为属性 Enabled -是否启用 Visible -是否隐藏2.CheckBox .CheckListBox - 复选框 复选框组 3.Com ...

  10. windbg sos加载相关

    使用windbg 加载sos.dll时,经常碰到报The call to LoadLibrary(C:\Windows\Microsoft.NET\Framework\v4.0.30319\sos.d ...