单例的应用

首先问一下单例是什么?

其实单例是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在。一般只要用到单例就会考虑线程安全问题(其实只要是应用程序开发都要考虑线程安全问题)。下面我们具体说一下把!

1.常见的第一中模式

.h文件中

1 #import <Foundation/Foundation.h>
2 
3 @interface Singleton : NSObject
4 
5 + (Singleton *)ShareIntance;
6 
7 @end

.m文件中

 1 #import "Singleton.h"
 2 
 3 static Singleton *instance = nil;
 4 
 5 @implementation Singleton
 6 
 7 + (Singleton *)ShareIntance
 8 {
 9     if (instance == nil) {
10         
11         instance = [[Singleton alloc] init];
12     }
13     
14     return instance;
15 }
16 
17 @end

这种模式简单已写,但是线程不安全,无法避免多个用户同时访问给instance赋值。

2.常见的第二种模式 GCD方法

.h文件中

1 #import <Foundation/Foundation.h>
2 
3 @interface Singleton : NSObject
4 
5 + (Singleton *)ShareIntance;
6 
7 @end

.m文件中

 1 #import "Singleton.h"
 2 
 3 static Singleton *instance = nil;
 4 
 5 @implementation Singleton
 6 
 7 + (Singleton *)ShareIntance
 8 {
 9 
10     static dispatch_once_t onceToken;
11     
12     dispatch_once(&onceToken, ^{
13         
14         instance = [[Singleton alloc] init];
15         
16     });
17     
18     
19     return instance;
20 }
21 
22 @end

这种写法满足了线程安全的要求,而且兼容ARC,是官方推荐使用。

3.还有常见的第三中模式 互拆锁

.h文件中

1 #import <Foundation/Foundation.h>
2 
3 @interface Singleton : NSObject
4 
5 + (Singleton *)ShareIntance;
6 
7 @end

.m文件中

 1 #import "Singleton.h"
 2 
 3 static Singleton *instance = nil;
 4 
 5 @implementation Singleton
 6 
 7 + (Singleton *)ShareIntance
 8 {
 9     
10     @synchronized(self) {
11         
12         if (instance == nil) {
13             
14             instance = [[Singleton alloc] init];
15         }
16     }
17     
18     return instance;
19 }
20 
21 @end

这中模式也是线程安全的,但是比较繁琐,推荐还是使用GCD方法,方便、快捷。

博主自己所理解的也就这么多,希望对于小白有用吧!

 

posted @ 2016-07-15 13:03  帝丿奎哥  阅读(138)  评论(0编辑  收藏  举报