什么是单例,为何须要单例?函数
单例模式的做用就是解决“应用中只须要一个实例”的问题。spa
当咱们须要一个类,而不太关注这个“类”自己的时候,例如iOS设备都有一个重力类UIAccelerometer,其实对于用户,只须要这个类的某些方法,好比实时获取数据,获取x,y,z轴的状态等。因此这个类只须要一个实例就够了,更多的实例只会占用更多的内存空间而已。code
实际应用中的单例对象
首先在我接触到的公司项目中,使用到的一个单例状况就是记录全部NSUserDefaults信息的单例PCSetting。NSUserDefaults自己就是一个单例,是iOS提供的轻量级数据持久化保存的类。blog
对于一个单例的建立,咱们须要:继承
1.建立一个继承于NSObject的类,而且在.h中声明一个类方法生命周期
@interface PCSettings : NSObject + (PCSettings*)sharedSettings;
2.在.m文件中分别建立一个静态变量,实现sharedSettings方法,以及重写init方法事件
static PCSettings *g_sharedSettings = nil; + (PCSettings *)sharedSettings { if (g_sharedSettings == nil) { g_sharedSettings = [[PCSettings alloc] init]; } return g_sharedSettings; } - (id)init { self = [super init]; if (self != nil) { NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; hub_userId = [[prefs objectForKey:KEY_HubUserID] copy]; . . . } return self; }
如此就完成了一个单例的建立啦。内存
另外一种经过GCD建立单例的方法资源
+ (PCSettings *)sharedSettings { static dispatch_once_t once; dispatch_once(&once, ^{ g_sharedSettings = [[self alloc]init]; } return g_sharedSettings; }
在上述代码中,dispatch_once函数就是由GCD提供的,它的做用是在整个应用程序生命周期中只执行一次代码块中的内容。dispatch_once可以记录该代码块是否被调用过。
Objective-C语法中的其余单例类
1.UIApplication
此类经过应用程序委托对象来响应低内存,应用启动,后台运行和应用终止等事件。
+ sharedApplication 建立
2.NSUserDefaults
轻量级数据存储类
+ standardUserDefaults 建立
3.NSNotificationCenter
采用观察者模式的通知机制
+ defaultCenter 建立
4.NSFileManager
提供了访问文件系统的通用操做,能够定位,建立,复制文件和文件夹
+ defaultManager 建立
5.NSBundle
操做本地资源,访问文件系统等功能
+ mainBundle 建立