单例模式是一种比较常用的设计模式,可以保证在程序的运行过程中,一个类只有一个实例,并且该实例能够方便访问;
本文使用两种方式来实现IOS单例;
两种方法的.h文件相同:
#import <Foundation/Foundation.h>
@interface ZNCat : NSObject
+(instancetype) sharedCar;
@end
常规的方法的.m文件:
#import "ZNCat.h"
@implementation ZNCat
static ZNCat* cat;
+(instancetype)allocWithZone:(struct _NSZone *)zone
{
// 如果创建该对象比较耗时,多线程同时创建多个对象,则不会是大力,需要加互斥锁;
@synchronized(self){
if (!cat) {
// TODO
// [NSThread sleepForTimeInterval:2.0];
cat = [super allocWithZone:zone];
}
}
return cat;
}
+(instancetype) sharedCar
{
@synchronized(self){
if (!cat) {
cat = [[self alloc] init];
}
}
return cat;
}
-(id)copy
{
return cat;
}
@end
GCD方法的.m文件:
#import "ZNCat.h"
@implementation ZNCat
static ZNCat* cat;
+(instancetype)allocWithZone:(struct _NSZone *)zone
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
cat = [super allocWithZone:zone];
});
return cat;
}
+(instancetype) sharedCar
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
cat = [[self alloc] init];
});
return cat;
}
-(id)copy
{
return cat;
}
@end