单例:保证一个类仅有一个实例,并提供一个访问它的全局访问点。它经常用于设计约束或者为了控制对有限资源的访问。
单例模式的思路是:一个类只能创建一个实例(永远是同一个)和一个活的该实例的方法(必须是类方法,通常使用getInstance)。
单例的实现:
#import "HeadMaster.h"
/*
创建一个校长类实现单例模式
1、为单例对象创建一个全局静态实例,并初始化,然后设置成nil
2、实现工厂方法,并返回一个对象,检查上面声明的全局静态实例是否为nil
如果是则新建并返回一个本类的实例,否则返回已经存在的本类的实例
3、重写allocWithzone、copyWithZone方法
4、重写retainCount、retain、release、autorelease方法
*/
@interface HeadMaster ()
+ (id) getInstance;
@end
//1.创建一个全局静态变量,并且初始化为nil
static HeadMaster *headMaster =nil;
@implementation HeadMaster
//2.实现工厂方法,返回一个单一对象
+ (id)getInstance{
//方法枷锁、一次只能有一个线程进入
@synchronized(self)
{
if (headMaster ==nil) {
headMaster =[[selfalloc]init];
}
}
returnheadMaster;
}
//3、为了防止通过alloc或者new创建新的实例,需要重写allocWithZone
+ (id)allocWithZone:(NSZone *)zone{
@synchronized(self)
{
if (headMaster ==nil) {
headMaster = [[superallocWithZone:zone]init];
}
}
returnheadMaster;
}
//4、为了防止通过copy创建实例,需要重写copyWithZone
+ (id)copyWithZone:(NSZone *)zone{
returnheadMaster;
}
//5、重写retainCount方法,防止被dealloc,此方法返回最大值
- (NSUInteger)retainCount{
returnNSUIntegerMax;
}
//6、重写retain方法,因为单例不释放,所以引用计数变化没有意义
- (id)retain{
return self;
}
//7、重写release方法,因为单例不释放,所以引用计数变化没有意义
- (oneway void)release{
/*
oneway用在分布式对象的API,这些API可以在不同的线程,甚至是不同的程序。
oneway关键字只用在返回类型为void的消息定义中,因为oneway是异步的,其消息预计不会立即返回。
*/
}
//8、重写autorelease方法,因为单例不释放,所以引用计数变化没有意义
- (id)autorelease{
return self;
}
@end