iOS设计模式之单利(Singleton)
2016-03-30 本文已影响872人
mieGod
介绍
单利是一种设计模式,就是在应用程序生命周期中,只会创建一个对象实例。在保存用户的信息、数据管理者等需要使用到单利。系统也有一些单利的例子:UIApplication
和NSUserDefaults
等。
创建方法
- 利用
GCD
创建
static Signleton *signleton = nil;
+ (instancetype)allocWithZone:(struct _NSZone *)zone
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
signleton = [super allocWithZone:zone];
});
return signleton;
}
+ (Signleton *)shareSignleton
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
signleton = [[self alloc] init];
});
return signleton;
}
+ (id)copyWithZone:(struct _NSZone *)zone
{
return signleton;
}
+ (id)mutableCopyWithZone:(struct _NSZone *)zone
{
return signleton;
}
- 还有就是普通的创建
static Signleton *signleton = nil;
+ (Signleton *)shareSignleton
{
//这里加锁是因为防止多线程同时调用
@synchronized(self) {
if (!signleton) {
signleton = [[self alloc] init];
}
return signleton;
}
}
+ (instancetype)allocWithZone:(struct _NSZone *)zone
{
@synchronized(self) {
if (!signleton) {
//调用父类分配内存空间
signleton = [super allocWithZone:zone];
}
return signleton;
}
}
+ (id)copyWithZone:(struct _NSZone *)zone
{
return signleton;
}
+ (id)mutableCopyWithZone:(struct _NSZone *)zone
{
return signleton;
}
// MRC情况下,需要额外写以下方法
- (oneway void)release
{
}
- (NSUInteger)retainCount
{
return INT32_MAX;
}
- (instancetype)autorelease
{
return signleton;
}
- (instancetype)retain
{
return signleton;
}