ARC下的单例及其应用

来源:互联网 发布:c语言中sleep函数 编辑:程序博客网 时间:2024/06/06 20:54

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.减少了代码量

0 0