您的位置:首页 > 其它

ARC环境下两种单例设计模式的比较:GCD和同步锁

2015-12-08 23:27 337 查看
A. 单例模式的设计思路:

(1)永远只分配一块内存来创建对象;

(2)提供一个类方法,返回内部唯一的实例;

(3)确保 init 方法只初始化一次;

(通常采用懒加载的方式在第一次用到实例的时候再去创建它。)

B. 单例模式的作用 :

可以保证在程序运行过程,一个类只有一个实例,而且该实例易于供外界访问,从而方便地控制了实例个数,并节约系统资源。

C. 单例模式的使用场合:

在整个应用程序中,共享一份资源(这份资源只需要创建初始化1次),那就应该让这个类创建出来的对象永远只有一个。

D. 示例Demo:

#import <Foundation/Foundation.h>

@interface TextTool : NSObject

// 使用GCD实现单例
+(instancetype)sharedGCDTool;

// 使用同步锁实现单例
+(instancetype)sharedSynTool;

@end
#import "TextTool.h"

@implementation TextTool

// 使用GCD实现单例
+(instancetype)sharedGCDTool{

// 声明一个静态变量去保存类的实例,确保它在类中的全局可用性。
static id _instance;

// 声明一个静态变量dispatch_once_t ,它确保初始化器代码只执行一次
static dispatch_once_t onceToken;

// 使用Grand Central Dispatch(GCD)执行初始化 TextTool 实例的block,这是单例模式的关键:一旦类被初始化,初始化器永远不会再被调用。
dispatch_once(&onceToken, ^{
_instance = [[self alloc] init];
});

return _instance;
}

// 使用同步锁实现单例
+(instancetype)sharedSynTool{

// 声明一个静态变量去保存类的实例,确保它在类中的全局可用性。
static TextTool *instance;

// 同步锁
@synchronized(self) {
if (instance == nil) {
instance = [[TextTool alloc] init];
}
}

return instance;
}

@end


#import "ViewController.h"
#import "TextTool.h"
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];

}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

[self testDemo];
}

// 性能检测
-(void)testDemo{

double t1 = CFAbsoluteTimeGetCurrent();
for (int i = 0; i < 999 * 999; i++) {
dispatch_async(dispatch_get_global_queue(0, 0), ^{
[TextTool sharedGCDTool];
});
}
double t2 = CFAbsoluteTimeGetCurrent();
NSLog(@"GCD----> %f",t2 - t1);

//--------------------------华丽分割线----------------------------------------------

double t3 = CFAbsoluteTimeGetCurrent();
for (int i = 0; i < 999 * 999; i++) {
dispatch_async(dispatch_get_global_queue(0, 0), ^{
[TextTool sharedSynTool];
});
}
double t4 = CFAbsoluteTimeGetCurrent();
NSLog(@"Syn====> %f",t4 - t3);
}

@end


输出结果:
显然,使用GCD创建的单例,耗时最短,性能高出很多。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  单例 arc 设计模式