{
1.单例简介:
作用:
保证程序在运行过程中,一个类只有一个实例对象.这个实例对象容易被外界访问!
控制实例对象个数(只有一个),节约系统资源.
使用场合:
在整个应用程序中,共享一份资源(这份资源只需要创建初始化一次).
举例:
打印机/视图窗口/一些网络工具类等等
//懒汉式:用到的时候再加载.
//饿汉式:只要程序运行就加载. //不需要掌握,也不要这么写!
//掌握懒汉式.
2.单例实现:(两种方式:互斥锁(@synchronized(self))和一次性代码(dispatch_once));
2.1互斥锁@synchronized(self):
<1>.在.m文件中保留一个全局的static的实例.
staticid_instance;
<2>.重写若干方法(allocWithZone:和copyWithZone:)并提供一个类方法让外界访问唯一的实例.
//(1)重写allocWithZone:方法,在这里创建唯一的实例(注意线程安全). //alloc内部都会调用这个方法.
+(instancetype)allocWithZone:(struct_NSZone *)zone {
if(_instance ==nil) {//防止频繁加锁
@synchronized(self) {
if(_instance ==nil) {//防止创建多次
_instance = [superallocWithZone:zone];
}
}
}
return_instance;
}
//(2)重写copyWithZone:方法.
+(id)copyWithZone:(struct_NSZone *)zone
{
return_instance;
}
//(3)提供1个类方法让外界访问唯一的实例
+(instancetype)shareSingleton
{
if(!_instance) {//防止频繁加锁
@synchronized(self){
if(!_instance) {//防止创建多次
_instance = [[selfalloc] init];
}
}
}
return_instance;
}
2.2一次性代码(dispatch_once):
<1>.在.m文件中保留一个全局的static的实例.
staticid_instance;
<2>.重写若干方法(allocWithZone:和copyWithZone:)并提供一个类方法让外界访问唯一的实例.
//(1)重写allocWithZone:方法,在这里创建唯一的实例(注意线程安全).
+ (id)allocWithZone:(struct_NSZone *)zone
{
staticdispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instace = [superallocWithZone:zone];
});
return_instace;
}
//(2)重写copyWithZone:方法.
+(id)copyWithZone:(struct_NSZone *)zone
{
return_instance;
}
//(3)提供1个类方法让外界访问唯一的实例
+ (instancetype)shareSingleton
{
staticdispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instace = [[selfalloc] init];
});
return_instace;
}
注意:在ARC和MRC中单例的实现方式略有不同. MRC下单例的实现比ARC多了几个内存管理的方法:
MRC中增加如下方法的实现:
- (instancetype)retain {returnself; }
- (NSUInteger)retainCount {return1; }
- (onewayvoid)release {}
- (instancetype)autorelease {returnself; }
3.判断当前环境(ARC/MRC)
#if __has_feature(objc_arc)
// ARC
#else
// MRC
#endif
4.注意两个方法:
//面试问题:两个方法的区别?
<1> +(void)load;
//当类加载到OC运行时环境(内 存)中的时候,就会调用一次(一个类只会加载一次).
//程序一启动就会调用.
//程序运行过程中,只会调用1次.
<2> +(void)initialize;
//当第一次使用这个类的时候(比如调用了类的某个方法)才会调用.
//并非程序一启动就会调用.
}