iOS设计模式之—单例模式浅谈
2016-10-23 23:38
323 查看
单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例。
object-c中单例模式,下面以Student类为模型进行举例
上面的单例方式全局构建了一个Student对象,共享了资源。注意:但是当多线程调用的时候会出现问题,比如几个线程同时调用的时候
Student为nil时,会出现各个线程都new一个Student对象,
那么如何解决此类问题呢? 代码如下:
还有一种方式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证实了这一点:如果被多个线程调用,该函数会同步等等直至代码块完成。
实际要如何使用这些呢?
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; }
相关文章推荐
- iOS设计模式之MVC设计模式浅谈
- 浅谈iOS设计模式
- ios之高人浅谈设计模式,架构,框架和类库的区别
- 浅谈iOS设计模式之单例模式
- 浅谈MVP与Model-View-ViewModel(MVVM)设计模式
- 浅谈BREW对面向对象,Windows,Java,设计模式的借鉴
- 浅谈MVP与Model-View-ViewModel(MVVM)设计模式
- [转]浅谈MVP与Model-View-ViewModel(MVVM)设计模式
- 从设计模式Observer的实现看OOD的设计——浅谈“多态”的设计原则
- 浅谈设计模式
- 设计模式浅谈
- 浅谈MVP与Model-View-ViewModel(MVVM)设计模式
- 浅谈设计模式在JAVA中的具体运用
- 浅谈设计模式(Bridge pattern和 Strategy pattern)
- iOS开发笔记 4、iOS中的Cocoa、设计模式等
- J2EE设计模式浅谈(一)
- 浅谈Route组件的设计思考与模式
- 浅谈MVP与Model-View-ViewModel(MVVM)设计模式
- 设计模式之UML类图关系浅谈。
- iOS的基本设计模式