一. 单例模式简介:
首先我们应该明白,我们每个项目中AppDelegate就是一个完美的单例.
(1)在程序运行过程中,单例只有一个实例对象,而且该实例易于供外界访问,从而方便控制了实例个数,节约资源.
(2)单例一般用于工具类,在整个应用程序中,字需要初始化一次,就可以共享一份资源.
(3)单例模式因为控制了实例化过程,所以累哦可以更加灵活实例化过程.
(4)单例对象一但被建立起来,对象指针被保留在静态区,在堆中分配的内存空间,不会自动释放,只有在程序终止,即杀死APP才会被释放.
(5)单例类无法实现OC的继承特性,因为使用继承,同事也会继承静态变量,而子类和父类同时创建的时候只会创建一个先创建的实例对象,因此一般不做类的扩展.
(6)单例可用来传值.
注:如果同一类型的对象总是要在不同是用例场景发生变化,单例就会引起数据的错误,不能保存彼此的状态.我们在使用单例类之前,一定要考虑好单例类是否适合类以后的扩展性,避免盲目滥用单例.
二.单例的代码实现:
单例都是继承于NSObject,首先,声明初始化方法
Singleton.h
@interface Singleton : NSObject
+(instancetype) shareInstance ;
@end
单例的实现方法有很多种,例如:
#import "Singleton.h"
static Singleton *instance = nil;
@implementtation Singleton
+(instancetype) shareInstance{
/// 1. GCD 最简单,常用的方法,很方便
static dispath_once_t onceToken;
dispath_once(&onceToken, ^{
if (instance == nil) {
instance = [[self alloc] init];
// 或 instance = [[Singleton alloc] init];
}
});
return instance;
// 返回值的类型可以是id,instancetype,或者类名(Singleton),不过要与声明保持一致.
// 2. 线程锁,(GCD是线程封装)
@synchronized (self) {
// 为了防止多线程同时访问对象, 造成多次分配内存空间, 所以要加上县城锁
if (instance == nil) {
instance = [[self alloc] init];
}
return instance;
}
}
@end
调用很简单[Singleton shareInstance]获取单例对象,做自己想干的事就好了.
单例很重要,用起来很方便,但并不难,这些在简单项目中足够了,