[UI]mbti的 j 人和 p 人有什么差别-单例再学习

[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资源的对象,例如数据库连接或者访问配置文件
某些对象被创建时会消耗大量的资源,但又经常使用的对象

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值