240 发简信
IP属地:河北
  • - (id)readForKey:(NSString *)key {
    __block id result;
    dispatch_sync(queue, ^{
    result = [self valueForKey:key];
    });
    }

    iOS常用的几种锁

    前言 开发中引入了异步和多线程的来提高程序性能,也就意味着线程安全成为了多线程的一个障碍,因此线程锁应运而生,而锁如果用不好,还会造成死锁的风险 下面就介绍ios中常用的几种...

  • 你说你这个宏定义,我如果传递一个 string给你判断,你会不会炸掉😎,直接 string.count, 然后GG

    刨根问底:OC 中如何判断 NSArray 为空

    一. 前言 日常开发中常会遇到这样的场景,在判断数组是否为空是,写成: 这种写法严格来说是不对的,并且很不稳定。如果你也怎么做了,那么恭喜你,欢迎入坑... 先问几个问题:(...

  • 当结构体内有结构体成员时,最大对齐规则,并不是针对 Mystruct2的整数倍,而是当前结构体或者某个结构体成员的最大成员大小double的8字节对齐,你可以改几次试一下,实际上Mystruct3最后结构只是8字节对齐,不存在16字节对齐

    struct Mystruct3{
    double b; //8字节
    int c; //4字节
    short d; //2字节
    char a; //1字节
    struct Mystruct2 str;
    }Mystruct3;

    iOS-底层原理 05:内存对齐原理

    iOS 底层原理 文章汇总[https://www.jianshu.com/p/412b20d9a0f6] 在探讨内存对齐原理之前,首先介绍下iOS中获取内存大小的三种方式 ...

  • 第一个one结构体大小应该是24,
    char :0
    int: 4,5,6,7
    double: 8,9,10,11,12,13,14,15
    char: 16
    0~16一共长度为17,最大元素double,8字节对齐,所以长度为24

    内存对齐三个原则

    1.结构体的总大小,必须要是其内部最大成员的整数倍,不足的要补齐。 2.结构体或联合的数据成员,第一个数据成员是要放在offset == 0的地方,如果遇上子成员,要根据子成...

  • 这图画的真的棒,我要有这画图水平,我天天写博客😏

    案例 03:金字塔、六边形、圆环的绘制

    OpenGL + OpenGL ES +Metal 系列文章汇总 该案例主要是对常见的图元连接方式的运用,常见的基本图元连接方式见此链接 最终实现的效果如图所示: 如图所示,...

  • 120
    iOS底层原理之kvc原理分析

    1.kvc:Key-Value Coding 基本类型使用 集合类型使用 非对象类型,转换成相应的NSValue,取值的时候,使用getValue接收取到的reslutVal...

  • 120
    iOS底层原理之load_images分析

    1. load_images的调用时机 在objc_init中,进行完一系列配置初始化完成之后 调用_dyld_objc_notify_register方法 map_imag...

  • 120
    Images加载一

    Objc中类的初始化是从_objc_init方法开始的。该方法的结构如下图: 首先是调用的是environ_init();这个方法。 这个方法里面主要是对环境变量的配置,方法...

  • iOS底层原理之类的加载处理

    1. _objc_init 程序在启动时,先用dyld进行动态库的链接,做完一系列准备操作之后,会进入到_objc_init方法 下面简单了解一下主角_dyld_objc_n...

  • 120
    iOS底层原理之消息转发

    简介 oc的方法调用,在底层会通过objc_msgSend进行消息发送 依次进行缓存快速查找imp,以及类的方法列表查找之后,如果仍然没有找到目标method,那么则进入消息...

  • 120
    iOS底层原理之消息发送

    1.方法的本质 1.1 探索 在之前的文章中,我们探索了对象、类、以及isa等的本质,那么今天我们一起来分析一下方法的本质,看看OC所调用的方法究竟是什么 首先进入targe...

  • @一只煮熟了的鸭子 这里的mask和capacity,可以看成数组下标和大小的关系,这里是我描述有误,抱歉

    iOS方法缓存-cache

    1. cache的结构 我们之前探索过Class的结构以及其内部的成员,其中了解到了isa,superClass以及bits的作用,但是剩下的cache,我们只能基本知道,其...

  • mask这地方我在下面回复了,是我的失误哈。。。抱歉

    iOS方法缓存-cache

    1. cache的结构 我们之前探索过Class的结构以及其内部的成员,其中了解到了isa,superClass以及bits的作用,但是剩下的cache,我们只能基本知道,其...

  • @一只煮熟了的鸭子
    1.mask的3/4这地方我的确是有误,应该改成capacity的3/4,因为在设置mask的时候会把mask设置成( setBucketsAndMask(newBuckets, newCapacity - 1)),而获取capacity()的时候也会用mask+1,这地方是我描述有误

    2.关于是否符合LRU算法这一点,LRU的确是“如果数据最近被访问过,那么将来被访问的几率也更高”,您的理解很标准,也是正规理解;
    那么最近一次将要被缓存的方法,也是最近一次被使用的方法,在后面被访问的几率也就更高,
    这点应该是符合LRU的思想的,
    其次您最后说的,内存空间足够的情况下添加至缓存,这点是没错的,但是当我A方法触发到3/4临界点时,其实剩余的空间也是足够我缓存的,因为看内部代码,可以发现,capacity的最小值其实是(1<<2 = 4),所以在扩容之前也是有空间可以缓存A方法的,这里之所以到后面新缓存扩容好再缓存A,而不是先缓存A,再和旧的缓存一起干掉,让新缓存里面是空的,我个人认为这应该也是缓存优化的一部分,也挺符合LRU的思想的,因为考虑到A是最新一次调用的,所以后面调用的概率可能更高,所以要方法新缓存扩容之后,再放进去,这是我的个人看法,

    iOS方法缓存-cache

    1. cache的结构 我们之前探索过Class的结构以及其内部的成员,其中了解到了isa,superClass以及bits的作用,但是剩下的cache,我们只能基本知道,其...

  • 120
    iOS方法缓存-cache

    1. cache的结构 我们之前探索过Class的结构以及其内部的成员,其中了解到了isa,superClass以及bits的作用,但是剩下的cache,我们只能基本知道,其...

  • 感谢段子手Cooci的点评

    iOS底层原理之内存对齐原理

    内存对齐是我们定义数据结构中一个必须要了解的知识点,内存对齐的目的在于能让系统从内存中快速的查找并且获取到我们想要获取的数据,达到空间换取时间的目的。下面简单介绍一下内存对齐...