博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
GCD单例-懒汉式&饿汉式
阅读量:4086 次
发布时间:2019-05-25

本文共 1576 字,大约阅读时间需要 5 分钟。

GCD一次性执行(once)

  • 1.原理:onceToken有个初始值为0,当第一次执行函数的时候,会判断onceToken是否是初始值,如果是初始值就执行代码块,反之,不执行代码块,提示:当第一次执行完代码块之前,会自动的修改初始值为非0的值
/// 演示安全性- (void)onceDemo{    for (NSInteger i = 0; i < 1000; i++) {        NSLog(@"makrmarkmarkmark");        dispatch_async(dispatch_get_global_queue(0, 0), ^{            static dispatch_once_t onceToken;            dispatch_once(&onceToken, ^{                NSLog(@"只执行一次");            });        });    }}

使用GCD设计单例模式(懒汉式单例)

  • 利用GCD的一次性执行,只alloc一次单例对象
  • 单利设计模式特点:
    • 1.有一个全局的访问点(类方法)
    • 2.保存在内存的静态存储区
    • 3.在内存中的实例有且只有一个
    • 4.声明周期和APP一样长
  • 单例的使用场景:
    • 1.在一些程序里面必须只有一个的类必须定义成单例(音乐播放器,视频播放器)
    • 2.在一些程序开发的过程中, 需要在很多类里面频繁使用的工具类,可以定义成单例

单例的缺点

  • 缺点就是保存在静态存储区,生命周期和APP一样长,如果过多的使用单例会造成内存飙升,单例虽好,但是在APP开发中不能过多的使用单例

懒汉式

MusicPlayer.h

#import 
@interface MusicPlayer : NSObject// 定义全局访问点+ (instancetype)sharedMusicPlayer;@end

MusicPlayer.m

#import "MusicPlayer.h"@implementation MusicPlayer// 懒汉式单例 : 开发中只用这个// 开发中定义单例的方式+ (instancetype)sharedMusicPlayer{    static id instance;    static dispatch_once_t onceToken;    dispatch_once(&onceToken, ^{        instance = [[self alloc] init];    });    return instance;}@end

使用GCD设计单例模式(饿汉式单例)

  • 1.这个方法只在这个类第一次使用的时候,就调用,早于alloc调用,只被调用一次,线程是安全的,开发时基本不是用这种方式

饿汉式

MusicPlayer.h

#import 
@interface MusicPlayer : NSObject// 定义全局访问点+ (instancetype)sharedMusicPlayer;@end

MusicPlayer.m

#import "MusicPlayer.h"@implementation MusicPlayerstatic id instance;// 饿汉式// 这个方法只在这个类第一次使用的时候,就调用;早于alloc调用// 只被调用一次,线程是安全的+ (void)initialize{    instance = [[MusicPlayer alloc] init];}+ (instancetype)sharedMusicPlayer{    return instance;}@end

转载地址:http://zfkii.baihongyu.com/

你可能感兴趣的文章
C++的三个基本特征:封装、继承、多态
查看>>
C++虚函数的总结
查看>>
什么是URL地址?
查看>>
C++多态的实现方式总结
查看>>
学习C++需要注意的问题
查看>>
C++模板
查看>>
C++双冒号(::)的用法
查看>>
【Unity】封装SQLite管理类
查看>>
【Unity】面试题整理
查看>>
【C#】如何实现一个迭代器
查看>>
【Unity】Destroy和DestroyImmediate的区别
查看>>
【Lua】Mac系统下配置SublimeText的Lua编译环境
查看>>
【C#】利用Conditional属性完成编译忽略
查看>>
【Unity】微信登录后将头像存为bytes,将bytes读取成sprite图片
查看>>
【Unity】使用GPS定位经纬度
查看>>
【UGUI/NGUI】一键换Text/Label字体
查看>>
【C#】身份证本地验证
查看>>
【Unity】坑爹的Bug
查看>>
【算法】求数组中某两个数的和为目标值
查看>>
如何高效学习动态规划?
查看>>