单例模式的意思就是这个类只有一个实例,这个类就是单例类。在iOS中有不少都是单例NSNull,NSFileManager ,UIApplication,NSUserDefaults ,UIDevice,还有一些第三方也有能用到了这种设计模式例如Afhttpmanger。。。

(1)单例模式的作用 :可以保证在程序运行过程,一个类只有一个实例,而且该实例易于供外界访问,从而方便地控制了实例个数,并节约系统资源。

(2)单例模式的使用场合:在整个应用程序中,共享一份资源(这份资源只需要创建初始化1次),应该让这个类创建出来的对象永远只有一个。

实现思路:

  1.   创建一个一个全局的static的实例   static id _instance;
  2.   提供1个类方法让外界访问唯一的实例
  3.   重写allocWithzone:方法,控制内存分配。因为alloc内部会调用该方法,每次调用allocWithzone:方法,系统都会创建一块新的内存空间。
  4.   实现copyWithZone:方法
  1. //
  2. // AudioPlayer.m
  3. // 单例
  4. //
  5. // Created by 两好三坏 on 16/2/21.
  6. // Copyright © 2016年 ;. All rights reserved.
  7. //
  8.  
  9. #import "AudioPlayer.h"
  10.  
  11. @interface AudioPlayer ()<NSCopying>
  12.  
  13. @end
  14.  
  15. @implementation AudioPlayer
  16.  
  17. //创建一个一个全局的static的实例 static id _instance;
  18.  
  19. static id _instance;
  20.  
  21. //提供1个类方法让外界访问唯一的实例
  22.  
  23. +(instancetype)shareAudioPlayer{
  24.  
  25. static dispatch_once_t onceToken;
  26.  
  27. dispatch_once(&onceToken, ^{
  28.  
  29. _instance = [[self alloc] init];
  30.  
  31. });
  32.  
  33. return _instance;
  34. }
  35.  
  36. //重写allocWithzone:方法,控制内存分配。因为alloc内部会调用该方法,每次调用allocWithzone:方法,系统都会创建一块新的内存空间。
  37.  
  38. +(instancetype)allocWithZone:(struct _NSZone *)zone{
  39.  
  40. static dispatch_once_t onceToken;
  41. dispatch_once(&onceToken, ^{
  42. _instance = [super allocWithZone:zone];
  43. });
  44. return _instance;
  45. }
  46.  
  47. //实现copyWithZone:方法
  48.  
  49. -(id)copyWithZone:(NSZone *)zone{
  50. return _instance;
  51. }
  52.  
  53. @end

在控制其中创建单例类的对象,打印地址:

  1. - (void)viewDidLoad {
  2. [super viewDidLoad];
  3.  
  4. AudioPlayer *player1 = [AudioPlayer shareAudioPlayer];
  5.  
  6. AudioPlayer *player2 = [[AudioPlayer alloc] init];
  7.  
  8. AudioPlayer *player3 = [AudioPlayer new];
  9.  
  10. AudioPlayer *player4 = [player1 copy];
  11.  
  12. NSLog(@"%p,%p,%p,%p",player1,player2,player3,player4);
  13.  
  14. }
  15.  
  16. //打印结果
  17. 2016-02-21 23:27:13.990 单例[2847:329685] 0x7fb6e3e080a0,0x7fb6e3e080a0,0x7fb6e3e080a0,0x7fb6e3e080a0

  四个实例的内存地址是一样的,证明只创建了一个实例;

MRC环境下通常需要在实现下面几个方法:

  1. - (oneway void)release {}
  2. - (id)retain { return _instance; }
  3. - (id)autorelease { return _instance; }
  4. - (NSUInteger)retainCount { return UINT_MAX; }

  可以使用宏判断是否为mrc,

  1. #if __has_feature(objc_arc)
  2. // ARC
  3. #else
  4. // MRC
  5. #endif

  

当然还可以把单例也抽取成为宏,用起来还挺方便的;你们也可以试试试~~~

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

  1. iOS 设计模式之单例

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

  2. iOS 如何创建单例对象

    一.什么是单例? 说到单例我就想起了我的java啊 ,不禁感叹起我的大学时光,学了4年的java开发,到现在还是放弃了我的java,踏入了iOS的行列. 算了,入正轨,我现在正是铁树银花的青春美少女, ...

  3. iOS Dev (67) 单例的实现

    iOS Dev (67) 单例的实现 博客:http://blog.csdn.net/prevention 作者:大锐哥 摘自:Learn iPhone and iPad cocos2d Game D ...

  4. 设计模式——懒汉式单例类PK饿汉式单例类

    前言 我们都知道生活中好多小软件,有的支持多IP在线,有的仅仅局限于单个IP在线.为什么这样设计,在软件开发阶段就是,有需求就是发展.这就是软件开发的一个设计模式--懒汉式单例类和饿汉式单例类. 内容 ...

  5. 详略。。设计模式1——单例。。。。studying

    设计模式1--单例 解决:保证了一个类在内存中仅仅能有一个对象. 怎么做才干保证这个对象是唯一的呢? 思路: 1.假设其它程序可以任意用new创建该类对象,那么就无法控制个数.因此,不让其它程序用ne ...

  6. 游戏设计模式——C++单例类

    前言: 本文将探讨单例类设计模式,单例类的懒汉模式/饿汉模式,单例类的多线程安全性,最后将利用C++模板减少单例类代码量. 本文假设有一个Manager管理类,并以此为探究单例类的设计模式. 懒汉模式 ...

  7. java软件设计模式只单例设计模式

    概述 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计 ...

  8. iOS开发之单例设计模式(完整正确版本)

    单例的意思从字面上就可以略知一二,所谓单例就是确保在程序运行过程中只创建一个对象实例.可以用于需要被多次广泛或者说多次使用的资源中,比如我们常见的网络请求类.工具类以及其它管理类等.比如我iOS开发中 ...

  9. IOS中的单例设计模式

    单例设计模式是IOS开发中一种很重要很常用的一种设计模式.它的设计原理是无论请求多少次,始终返回一个实例,也就是一个类只有一个实例.下面是苹果官方文档中关于单例模式的图片: 如图所示,左边的图是默认的 ...

随机推荐

  1. 查看进程id

    #!/usr/bin/env python # encoding: utf-8  # Date: 2018/6/16 from multiprocessing import Processimport ...

  2. OD 实验(二) - 绕过序列号验证

    需要破解的程序 输入用户名和序列号,点击 Check,程序会进行校验 用 OD 打开程序 按快捷键 Ctrl+F9 跟随表达式 GetDlgItemTextA 点击 ok 在这里调用了 GetDlgI ...

  3. MonkeyScript测试命令集合

    MonkeyScript:(不支持截屏) 可以被Monkey识别的集合命令 可以完成重复固定的操作   MonkeyRunner(支持截屏操作) 提供一系列API,可以完成模拟事件和截屏操作   Mo ...

  4. day9-IO 番外

    同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的.所以先限定一下本文的上下文. 本文讨论的背景是Linux环境下的network IO. ...

  5. VUE 初步学习

    Vue 简单的总结一 Vue 简单的总结二 Vue 简单的总结三 Vue 简单的总结四(项目流程) Vue 简单的总结五 Vue(6)- Vue-router进阶.单页面应用(SPA)带来的问题 Vu ...

  6. vue之vue-router跳转

    vue之vue-router跳转 一.配置 在初始化使用vue-cli的时候会有vue-router的安装选择,选择安装即可. 二.嵌套路由 一般情况下,登录和项目页面属于同级,所以App.vue 只 ...

  7. Image与Bitmap的区别及相互转换

    1. Image.FromFile()返回的是某个继承自Image的具体类的对象,在这里,就是Bitmap或者Metafile其中之一.这应该算是factory pattern的一种形式.所以,Ima ...

  8. delphi 选择文件夹,路径选择,浏览文件夹

    选择文件夹,路径选择, 文件夹 资源管理器 推荐  SelectDirectory http://docwiki.embarcadero.com/Libraries/Seattle/en/Vcl.Fi ...

  9. 全面了解POI操作Microsoft Office(Word、Excel、PowerPoint)

    POI 与 Microsoft Office 1. POI 简介 POI 是 Apache 下的 Jakata 项目的一个子项目,主要用于提供 java 操作 Microsoft Office 办公套 ...

  10. oracel 查询删除重复记录的几种方法

    建表语句CREATE TABLE Persons(PersonID int,           LastName varchar(255),FirstName varchar(255),Addres ...