zoukankan      html  css  js  c++  java
  • iOS 单例模式 学习 "52个方法 第6章 45条 使用 dispath_once 来执行只需运行一次的线程安全代码"

    百度定义:单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例.

    维基百科:在软件工程中,单例是一种用于实现单例的数学概念,即将类的实例化限制成仅一个对象的设计模式。

    简单理解:单例模式 是只有有一个实例对象的设计模式

    这次 使用 单例 用 gcd 来创建

    解释几个关键词

    dispatch_once  :这个代码块 在整个应用的生命周期 只执行一次, 并且线程安全(如果被多个线程调用,该函数会同步等待直至代码块完成。gcd的底层做处理保证线程安全)

    dispatch_once_t:(参数)这个断言 是声明这个代码块是否已经创建过了

    优点:

    (1)dispatch_once 线程安全

    (2)代码简洁

    (3)高效(比@synchronized 的两倍 "52个技巧上说的")

    我的使用场景很简单, 我想创建一个单例字典 存储 刷新关键字 利用逻辑变化条件 指定刷新页面

    我写的枚举恰好用到了 "52个技巧"里面学到的知识,因为  枚举 不一定得是 正整数 还可以是 四个字符的(通常4个字符代表一个字节 int 是4个字节)

    这样 我可以定义不同页面的枚举 并且每个页面有自己独立的枚举参数

    使用:

    使用的时候 直接调用 类方法里面的实例方法 [AHFRefreshPageUtil shareInstance]setNeedRefreshStatus:YES type:AHFSearchRefreshTypeAll];

    这样可以保证键值对 唯一

    展示创建单例:

    //
    //  AHFRefreshPageUtil.h
    //  dailylife
    //
    //  Created by HF on 16/5/3.
    //
    //
    
    #import <Foundation/Foundation.h>
    
    @interface AHFRefreshPageUtil : NSObject
    
    
    + (AHFRefreshPageUtil *)sharedInstance;
    
    @end
    
    //
    //  AHFRefreshPageUtil.m
    //  dailylife
    //
    //  Created by HF on 16/5/3.
    //
    //
    
    #import "AHFRefreshPageUtil.h"
    
    @implementation AHFRefreshPageUtil
    {
        NSMutableDictionary *refreshDictionary;
    }
    static AHFRefreshPageUtil *refreshPageUtil;
    
    - (instancetype)init
    {
        self = [super init];
        if(self){
            refreshDictionary = [NSMutableDictionary dictionary];
        }
        return self;
    }
    
    + (AHFRefreshPageUtil *)sharedInstance
    {
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            refreshPageUtil = [[AHFRefreshPageUtil alloc] init];
        });
        return refreshPageUtil;
    }
    //待添加目标实例方法

    其实 这里 这么写有潜在的bug  假如 使用

    [[AHFRefreshPageUtil  alloc]init] 就是 普通的初始化了,不是单例用法了 所以  应该 把alloc 和 copy 都重写 防止意外出错,但是 我这里就默认 这一个用法,如果 出现 alloc 用法(并没有类似需求的情况下) 那一定是猪队友干的,review代码 好好说说他 就好了 哈哈 此处 不再多余添加代码(如果你想写的完美 可以尝试重写 alloc copy 方法 让他们返回时候 都是 同一个实例"sharedInstance" 就好了)

    我的一个技术网友 总结的挺好的 简单一句话" 主要看如何实现线程唯一的创建 "

  • 相关阅读:
    使用YApi搭建API接口管理工具(docker安装)
    Redis 的持久化
    Typora编写markdown插入本地图片时自动上传图片到博客园
    关于python docker镜像环境下无法apt安装wkhtml2pdf的解决方案
    10分钟搞定让你困惑的 Jenkins 环境变量
    基于docker 搭建Prometheus+Grafana的过程详解
    docker方式搭建ELK日志平台
    ingress-nginx跨域解决
    k8s中pod优雅关闭进程
    java反编译命令
  • 原文地址:https://www.cnblogs.com/someonelikeyou/p/5455737.html
Copyright © 2011-2022 走看看