您的位置:首页 > 移动开发 > Objective-C

Objective-C单例模式实现

2015-06-08 10:15 375 查看
在OC中我们通常通过[b]@synchronized同步锁GCD两种方式来实现单例,代码如下:[/b]

@synchronized同步锁

static Instance *obj = nil;
+ (id)sharedInstance
{
@synchronized(self)
{
if(!obj)
obj = [[Instance alloc] init];
}
return obj;
}


GCD

static Instance *obj = nil;
+ (id)sharedInstance
{
static dispatch_once_t once;
dispatch_once(&once, ^{
obj = [[Instance alloc] init];
});
return obj;
}


这个静态方法就是我们向整个系统提供的对该类单实例的唯一访问点。但是这样是无法保证该类是单实例的,因为还有其他实例化方法,如:[[xxx alloc]init],我们还需要做一些其他的工作,代码如下:

重写allocWithZone方法

+ (instancetype)allocWithZone:(struct _NSZone *)zone {
//确保对同一实例及其成员不重新分配内存
if (obj == nil) {
@synchronized(self){
obj = [super allocWithZone:zone];
}
}
return obj;
}


适当修改init方法

//保证成员变量只被初始化一次
if(!_xxx)
{
_xxx = [[类名 alloc]init];
}


注:与同步锁的方式相比,通过GCD来实现单例,效率更高。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息