第一、基本概念
单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问。
第二、在IOS中使用单例模式的情况
1.如果说创建一个对象会耗费很多系统资源,那么此时采用单例模式,因为只需要一个实例,会节省alloc的时间
2.在IOS开发中,如果很多模块都要使用同一个变量,此时如果把该变量放入单例类,则所有访问该变量的调用变得很容易,否则,只能通过一个模块传递给另外一个模块,这样增加了风险和复杂度
第三、创建单例模式的基本步骤
1.声明一个单例对象的静态实例,并初始化为nil
2.声明一个类的工厂方法,生成一个该类的实例,并且只会生成一个
3.覆盖allcoWithZone方法,确保用户在alloc 时,不会产生一个多余的对象
4.实现NSCopying协议,覆盖release,autorelease,retain,retainCount方法,以确保只有一个实例化对象
5.在多线程的环境中,注意使用@synchronized关键字
static MyClass *class = nil;
@implementation MyClass
+(MyClass *)sharedMyClass{
@synchronized (self){//为了确保多线程情况下,仍然确保实体的唯一性
if (!class) {
[[self alloc] init];//非ARC模式下,该方法会调用 allocWithZone
}
return class;
}
}
+(id)allocWithZone:(NSZone *)zone{
@synchronized(self){
if (!class) {
class = [super allocWithZone:zone]; //确保使用同一块内存地址
return class;
}
return nil;
}
}
-(id)init; {
@synchronized(self) {
if (self = [super init]){
return self;
}
return nil;
}
}
-(id)copyWithZone:(NSZone *)zone;{
return self; //确保copy对象也是唯一
}
-(id)retain{
return self; //确保计数唯一
}
-(unsigned)retainCount
{
return UINT_MAX; //装逼用的,这样打印出来的计数永远为-1
}
-(id)autorelease
{
return self;//确保计数唯一
}
-(oneway void)release
{
//重写计数释放方法
}