• 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" 就好了)

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

  • 相关阅读:
    git命令评测
    so文件成品评论【整理】
    Codeforces 85B. Embassy Queue【段树、馋】
    JPEG图像扩展信息读取和修改
    【 D3.js 入门系列 --- 0 】 简介及安装
    unity3d 学习笔记(三)
    ListView 泛利
    [React] Create an Auto Resizing Virtualized List with react-virtualized
    [PReact] Integrate Redux with Preact
    [Preact] Integrate react-router with Preact
  • 原文地址:https://www.cnblogs.com/someonelikeyou/p/5455737.html
Copyright © 2020-2023  润新知