GCD单例-懒汉式&饿汉式

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 <Foundation/Foundation.h>

@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 <Foundation/Foundation.h>

@interface MusicPlayer : NSObject

// 定义全局访问点
+ (instancetype)sharedMusicPlayer;

@end

MusicPlayer.m

#import "MusicPlayer.h"
@implementation MusicPlayer

static id instance;

// 饿汉式
// 这个方法只在这个类第一次使用的时候,就调用;早于alloc调用
// 只被调用一次,线程是安全的
+ (void)initialize
{
    instance = [[MusicPlayer alloc] init];
}

+ (instancetype)sharedMusicPlayer
{
    return instance;
}

@end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zok93

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值