创建单例类的方法
方法一:
+ (instancetype)sharedSkinManager {
//Apple官方推荐的单例写法,这种写法也能够保证多线程的情况下只有一个对象
static ZYSkinManager* manager =nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
manager = [[ZYSkinManageralloc] init];
});
return manager;
// dispatch_once这个block中的方法,永远只会执行一次
// 参考ZYFirstViewController中的touchesEnded
}
单例是一种类,该类只能实例化一个对象。
void dispatch_once( dispatch_once_t *predicate, dispatch_block_t block);
如果被多个线程调用,该函数会同步等等直至代码块完成。
+ (AccountManager *)sharedManager {
static AccountManager *sharedAccountManagerInstance = nil;
static dispatch_once_t predicate; dispatch_once(&predicate, ^{
sharedAccountManagerInstance = [[self alloc] init];
});
return sharedAccountManagerInstance;
}
AccountManager *accountManager = [AccountManager sharedManager];
AccountManager *accountManager = [[AccountManager alloc] init];
方法二:
+ (ZYImageCacheManager *)sharedManager
{
//如果静态变量没有值就说明,这个类的对象从来就没有创建过
@synchronized (self)
{
if (manager ==nil)
{
manager = [[selfalloc] init];
}
}
returnmanager;
}
// 重写alloc方法,防止别人手动调用alloc导致单例失效
+ (id)alloc
{
@synchronized (self)
{
if (manager ==nil)
{
// 如果这里调用自身的alloc,会死循环
//但是又必须创建一个对象出去,那么就只能调用父类的alloc方法
manager = [superalloc];
}
}
returnmanager;
}