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

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

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

实现思路:

  1.   创建一个一个全局的static的实例   static id _instance;
  2.   提供1个类方法让外界访问唯一的实例
  3.   重写allocWithzone:方法,控制内存分配。因为alloc内部会调用该方法,每次调用allocWithzone:方法,系统都会创建一块新的内存空间。
  4.   实现copyWithZone:方法
//
// AudioPlayer.m
// 单例
//
// Created by 两好三坏 on 16/2/21.
// Copyright © 2016年 ;. All rights reserved.
// #import "AudioPlayer.h" @interface AudioPlayer ()<NSCopying> @end @implementation AudioPlayer //创建一个一个全局的static的实例 static id _instance; static id _instance; //提供1个类方法让外界访问唯一的实例 +(instancetype)shareAudioPlayer{ static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _instance = [[self alloc] init]; }); return _instance;
} //重写allocWithzone:方法,控制内存分配。因为alloc内部会调用该方法,每次调用allocWithzone:方法,系统都会创建一块新的内存空间。 +(instancetype)allocWithZone:(struct _NSZone *)zone{ static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [super allocWithZone:zone];
});
return _instance;
} //实现copyWithZone:方法 -(id)copyWithZone:(NSZone *)zone{
return _instance;
} @end

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

- (void)viewDidLoad {
[super viewDidLoad]; AudioPlayer *player1 = [AudioPlayer shareAudioPlayer]; AudioPlayer *player2 = [[AudioPlayer alloc] init]; AudioPlayer *player3 = [AudioPlayer new]; AudioPlayer *player4 = [player1 copy]; NSLog(@"%p,%p,%p,%p",player1,player2,player3,player4); } //打印结果
2016-02-21 23:27:13.990 单例[2847:329685] 0x7fb6e3e080a0,0x7fb6e3e080a0,0x7fb6e3e080a0,0x7fb6e3e080a0

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

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

- (oneway void)release {}
- (id)retain { return _instance; }
- (id)autorelease { return _instance; }
- (NSUInteger)retainCount { return UINT_MAX; }

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

#if __has_feature(objc_arc)
// ARC
#else
// MRC
#endif

  

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

最新文章

  1. Windows下使用scapy+python2.7实现对pcap文件的读写操作
  2. Java中字符串比较时==和equals的区别
  3. JavaScript富应用MVC MVVM框架
  4. 在Windows8下安装SQL Server 2005无法启动服务
  5. Unity3D 4.x 使用Mecanim实现连击
  6. (转)freemakeer初入门
  7. C++内存未释放的情况
  8. HDU 5802 Windows 10 (贪心+dfs)
  9. web.xml(spring/spring mvc/hibernate)
  10. Android进阶练习一
  11. Leetcode题解(20)
  12. javascript模块化编程库require.js的用法
  13. css_选择器
  14. Xeon Phi 《协处理器高性能编程指南》随书代码整理 part 4
  15. Hdoj 2191.悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 题解
  16. (20)gevent协程
  17. RIP笔记
  18. 排查mysql innodb Lock wait timeout exceeded; try restarting transaction的问题
  19. Android 7.0下,拍摄照片报错
  20. mysql 数据库必备命令操作,入门练习一下

热门文章

  1. 从windows拷贝到linux的脚本报错:未找到命令 or 语法错误
  2. 小酌Jmeter4.0新版本特性
  3. STL之父Stepanov谈泛型编程的发展史
  4. Android 4 学习(20):ActionBar
  5. 【转】javascript 执行环境,变量对象,作用域链
  6. zedgraph绘图(修改)
  7. Redis实战——简单介绍
  8. nginx实现多个域名共享80端口
  9. Python 格式化输出 ( 颜色 )
  10. Java设计模式学习06——静态代理与动态代理(转)