dispatch_once 创建单例模式:
单例模式确保一个类只有一个实例,自行提供这个实例并向整个系统提供这个实例。
dispatch_once函数中的代码块只会执行一次,而且是线程安全的。
// ViewController.m
// MyGizmoDemo
//
// Created by yons on 15-3-3.
// Copyright (c) 2015年 yons. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
/**
步骤:
1.一个静态变量_inastance
2.重写allocWithZone, 在里面用dispatch_once, 并调用super allocWithZone
3.自定义一个sharedXX, 用来获取单例. 在里面也调用dispatch_once, 实例化_instance
-----------可选------------
4.如果要支持copy. 则(先遵守NSCopying协议)重写copyWithZone, 直接返回_instance即可.
*/
/**第1步: 存储唯一实例*/
static ViewController *_instance;
/**第2步: 分配内存孔家时都会调用这个方法. 保证分配内存alloc时都相同*/
+(id)allocWithZone:(struct _NSZone *)zone{
//调用dispatch_once保证在多线程中也只被实例化一次
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [super allocWithZone:zone];
});
return _instance;
}
/**第3步: 保证init初始化时都相同*/
+(instancetype)sharedTool{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [[ViewController alloc]init];
});
return _instance;
}
/**第4步: 保证copy时都相同*/
-(id)copyWithZone:(NSZone *)zone{
return _instance;
}
- (void)viewDidLoad {
[super viewDidLoad];
//实例化一个类的几种方法. 单例就是要保证实例化出来的类是同一个类
//1.alloc init方法. 一般不这么来调用单例.
ViewController *v1 = [[ViewController alloc]init];
ViewController *v2 = [[ViewController alloc]init];
ViewController *v3 = [ViewController sharedTool];
ViewController *v4 = [v3 copy];
NSLog(@"%@/n",v1);
NSLog(@"%@/n",v2);
NSLog(@"%@/n",v3);
NSLog(@"%@/n",v4);
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
使用dispatch_once的好处:
1.线程安全
2.很好的满足静态分析需求
3.自动引用计数(ARC)兼容
4.减少了代码量