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