一、单例 singleTon
单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。在项目中适于全局共享某个资源,保证其唯一性。如用户登录信息。
单例模式一般使用类方法创建。
特点:
1、全局都可以访问到
2、操作单例对象的变量不会被释放
3、每次获取的对象都是同一个对象,只创建一次。通过单例方法创建的对象是同一个对象。
@interface Single_Ton : NSObject
//创建单例对象的方法,一般作为类方法
//命名规则 shared + 类名 或 standard + 类名
+ (Single_Ton *)sharedSingleTon;
@end
每次通过该方法获取对象时,需要判断是否开辟过空间,如果已经开辟过则直接返回已有对象,否则开辟空间,创建对象
如果出现同时抢夺一个资源,这里是多个线程,同时执行该方法。去创建对象,如果不做线程安全处理,会造成在开辟空间的同时,又有一个线程去开辟空间,这就不是单例了,因此我们需要添加线程处理。
同步锁,在同步锁内的代码段受线程保护,一次只能有一个线程执行。在多线程情况下,后面的线程需等待
@implementation Single_Ton
static Single_Ton *singleTon = nil;
+ (Single_Ton *)sharedSingleTon {
//添加同步锁
@synchronized(self) {
if (nil == singleTon) {
//没有创建过,创建对象
singleTon = [[Single_Ton alloc] init];
//完整的单例,避免死循环
//singleTon = [[super allocWithZone:nil] init];
}
return singleTon;
}
}
完整的单例 有时不仅通过特定方法取到的是同一个对象,进行 alloc copy mutableCopy 获取到的也是同一个对象。就需要我们重写这些方法,做一些内部实现
+ (instancetype)alloc {
return [Single_Ton sharedSingleTon];
}
+ (instancetype)allocWithZone:(struct _NSZone *)zone {
return [Single_Ton sharedSingleTon];
}
- (id) copy {
return [Single_Ton sharedSingleTon];
}
- (id)mutableCopy {
return [Single_Ton sharedSingleTon];
}
- (oneway void)release {
//oneway void 返回值为空,不做任何操作
}
- (NSUInteger)retainCount {
return NSUIntegerMax;//返回整形最大值
}
@end
使用CGD线程实现单例创建
static Single_Ton *singleTon = nil;
+ (Single_Ton *)sharedSingleTon {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
singleTon = [[Single_Ton alloc] init];
});
return singleTon;
}