[UI]mbti的 j 人和 p 人有什么差别-单例再学习
题外话
什么是 MBTI
迈尔斯-布里格斯性格分类指标(英语:Myers-Briggs Type
Indicator,简称MBTI)是人格类型学中一种内省的自我报告问卷,它表明人们在感知和决策的方式上存在不同心理偏好[1][2][3][4]。该评量为以下四个向度分别指定一个倾向:内向(Introversion)或外向(Extraversion)、实感(Sensing)或直觉(Intuition)、思考(Thinking)或情感(Feeling)、判断(Judging)或感知(Perceiving),并取各倾向的英文名称首字母来组成四个字母的评量结果,如“INFJ”或“ENFP”等16种人格类型[5][6][7]。–wikipedia
这里的互联网笑话在于
对 j 人的刻板印象是工作计划狂 对 p 人刻板印象则是拖延症患者
这两个是令人讨厌的评价 可见世界上没有一个人会被所有人喜欢
当然 最令人讨厌的是 解释笑话 这比谜语人还要过分
单例的两个模式
哦对 这里默认大家都知道什么是单例了
不知道的可以先看本篇最后
懒汉模式
这个就是纯的拖延症了 我在前一个介绍单例的博客也介绍过这个模式
- 需要的时候才会创建实例对象
- 懒汉式是典型的时间换空间,也就是每次获取实例都会进行判断,看是否需要创建实例,浪费判断的时间。当然,如果一直没有人使用的话,那就不会创建实例,则节约内存空间。
- 从线程安全性上讲,不加同步的懒汉式是线程不安全的
懒汉式创建对象的方法是在程序使用对象前,先判断该对象是否已经实例化(判空),若已实例化直接返回该类对象。,否则则先执行实例化操作
#import "Model.h"
static id instance = nil;
@implementation AModel
+ (id)sharInstance {
if (instance == nil) {
instance = [[self alloc] init];
}
return instance;
}
@end
当然 多线程情况下有些不安全 那怎么办
#import "Model.h"
static id instance = nil;
@implementation AModel
+ (id)sharInstance {
//定义一个dispatch_once_t类型的名为onceToken的静态全局变量,确保它在运行时只会被初始化一次
static dispatch_once_t onceToken;
//调用dispatch_once函数,该函数用于确保一个代码块只执行一次。
//它接受两个参数:一个指向dispatch_once_t类型变量的指针,以及一个表示需要执行一次的代码块的匿名函数
dispatch_once(&onceToken, ^{
instance = [[self alloc] init];
});
return instance;
}
@end
还有其他方法吗
#import "Model.h"
static id instance = nil;
@implementation AModel
+ (id)sharInstance {
return [[self alloc] init];
}
+ (instancetype)allocWithZone:(struct _NSZone *)zone {
//@synchronized的作用是创建一个互斥锁,保证此时没有其他线程对self对象进行修改,保证代码的安全性
@synchronized (self) {
if (instance == nil) {
instance = [super allocWithZone:zone];
}
}
return instance;
}
@end
饿汉模式
提前做好一切准备 但是计划有时会赶不上变化
是的我是严重拖延症患者 毕竟三篇博客积累到一个晚上发
- 在类加载时已经创建好该单例对象,在获取单例对象时直接返回对象即可,不会存在并发安全和性能问题
饿汉模式在类加载时已经创建好该对象,在程序调用时直接返回该单例对象即可,即我们在编码时就已经指明了要马上创建这个对象,不需要等到被调用时再去创建
static id instance;
@implementation EHanModel
//当类加载到OC运行环境中(内存)时,就会调用一次(一个类只会加载一次)
+ (void) load {
instance = [[self alloc] init];
}
+ (instancetype)allocWithZone:(struct _NSZone *)zone {
@synchronized (self) {
if (instance == nil) {
instance = [super allocWithZone:zone];
}
}
return instance;
}
+ (id)sharInstance {
return [[self alloc] init];
}
@end
前情提要
单例模式
指在内存中只会创建且仅创建一次对象的设计模式。在程序中多次使用同一个对象且作用相同时,为了防止频繁地创建对象使得内存飙升,单例模式可以让程序仅在内存中创建一个对象,让所有需要调用的地方都共享这一单例对象
作用
通过类实例化的对象一般都是放在堆内存中的,频繁的创建对象会使得堆内存不够用,进而触发垃圾回收,这会影响整个系统的性能
单例模式保证了这个类只有一个实例,并且提供的这个实例可以被反复使用,显然可以大大减少内存资源消耗。
应用场景
频繁地创建和销毁对象
频繁访问IO资源的对象,例如数据库连接或者访问配置文件
某些对象被创建时会消耗大量的资源,但又经常使用的对象