您的位置:首页 > 移动开发 > IOS开发

iOS设计模式之—单例模式浅谈

2016-10-23 23:38 323 查看
单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例。

object-c中单例模式,下面以Student类为模型进行举例

+(Student *)shareStudent{
static Student *s = nil;
if (s == nil){
s =[ [Student alloc]init];
}
return s;
}

上面的单例方式全局构建了一个Student对象,共享了资源。注意:但是当多线程调用的时候会出现问题,比如几个线程同时调用的时候
Student为nil时,会出现各个线程都new一个Student对象,

那么如何解决此类问题呢? 代码如下:

//对象同一时间只能被同一个线程访问


+(Student *)shareStudent{
@syschronized(self){
static Student *s = nil;
if (s == nil){
s =[ [Student alloc]init];
}
return s;
}
}




还有一种方式GCD,更好 保证代码只执行一次,保证了线程安全使用Objective-C实现单例模式的最佳方式向来有很多争论,开发者(包括Apple在内)似乎每几年就会改变他们的想法。当Apple引入了GrandCentral Dispatch
(GCD)(Mac OS 10.6和iOS4.0),他们也引入了一个很适合用于实现单例模式的函数,该函数就是dispatch_once:void
dispatch_once( dispatch_once_t *predicate, dispatch_block_t block)该函数接收一个dispatch_once用于检查该代码块是否已经被调度的谓词(是一个长整型,实际上作为BOOL使用)。它还接收一个希望在应用的生命周期内仅被调度一次的代码块,对于本例就用于shared实例的实例化。dispatch_once不仅意味着代码仅会被运行一次,而且还是线程安全的,这就意味着你不需要使用诸如@synchronized之类的来防止使用多个线程或者队列时不同步的问题。Apple的GCD
Documentation证实了这一点:如果被多个线程调用,该函数会同步等等直至代码块完成。 
实际要如何使用这些呢?
+(Student *)sharedInstance
{
static Student *s = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
if (s == nil){
Student= [[Student alloc] init];
}
});
return s;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: