GCD单例-懒汉式&饿汉式

来源:互联网 发布:淘宝助理怎么复制 编辑:程序博客网 时间:2024/05/04 19:59

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 MusicPlayerstatic id instance;// 饿汉式// 这个方法只在这个类第一次使用的时候,就调用;早于alloc调用// 只被调用一次,线程是安全的+ (void)initialize{    instance = [[MusicPlayer alloc] init];}+ (instancetype)sharedMusicPlayer{    return instance;}@end
0 0
原创粉丝点击