240 发简信
IP属地:上海
  • 120
    关联对象

    在分类中不能添加属性,但是却可以使用 关联对象的方式,给类添加变量。主要重点是: 关联对象的实现方式。 关联对象散列表的存储和查找逻辑 关联对象的设置,以及retain/re...

  • void attachLists(List* const * addedLists, uint32_t addedCount) {
    if (addedCount == 0) return;

    if (hasArray()) {
    // many lists -> many lists
    uint32_t oldCount = array()->count;
    uint32_t newCount = oldCount + addedCount;
    setArray((array_t *)realloc(array(), array_t::byteSize(newCount)));
    array()->count = newCount;
    memmove(array()->lists + addedCount, array()->lists,
    oldCount * sizeof(array()->lists[0]));
    memcpy(array()->lists, addedLists,
    addedCount * sizeof(array()->lists[0]));
    }
    else if (!list && addedCount == 1) {
    // 0 lists -> 1 list
    list = addedLists[0];
    }
    else {
    // 1 list -> many lists
    List* oldList = list;
    uint32_t oldCount = oldList ? 1 : 0;
    uint32_t newCount = oldCount + addedCount;
    setArray((array_t *)malloc(array_t::byteSize(newCount)));
    array()->count = newCount;
    if (oldList) array()->lists[addedCount] = oldList;
    memcpy(array()->lists, addedLists,
    addedCount * sizeof(array()->lists[0]));
    }
    }

    方法查找流程 lookUpImpOrForward

    objc的方法调用底层时消息的发送,调用objc_msgSend的方法。之前分析过 objc-msg-x86_64.s 汇编文件学习[https://www.jianshu....

  • 类的 methodlist 是一个二维数组, 每一个分类的methods 是一个一维的数组,每次添加分类的方法是,都会添加到类的methodlist的数组中去。同样对于 runtime的addMethod 方法,也是添加一个数组到二维数组中。对于同名方法 是不会再同一个一维数组之中的,这是根据分类的加载顺序确定的。

    方法查找流程 lookUpImpOrForward

    objc的方法调用底层时消息的发送,调用objc_msgSend的方法。之前分析过 objc-msg-x86_64.s 汇编文件学习[https://www.jianshu....

  • block 的底层逻辑,变量的捕获, 以及__block 的底层实现

    block 经常被用到,那么再底层它是如何被实现的,以及 相关的变量捕获和__block 是怎么处理的呢 准备工作 clang 命令,将.m 转称.cpp libclosur...

  • 线程同步1-锁 @synchroinzed

    os_unfair_lock #import <os/lock.h> os_unfair_lock 是用来替代 OSSPinLock 的一个互斥锁。OSSpinLock 是采...

  • 线程同步1-锁

    同步 多线程操作访问修改统一资源会产生混乱的情况,使用同步工具来了防止不同的线程意外更改数据。 同步基本使用下面几种方式 锁 原子操作 内存壁垒和易失性变量 原子操作,是一种...

  • GCD

    GCD 调度队列是一个类似对象的结构,用于管理您提交给它的任务。所有调度队列都是先进先出数据结构。因此,添加到队列中的任务始终以与添加任务相同的顺序启动。 在当前的OS X和...

  • 关联对象

    在分类中不能添加属性,但是却可以使用 关联对象的方式,给类添加变量。主要重点是: 关联对象的实现方式。 关联对象散列表的存储和查找逻辑 关联对象的设置,以及retain/re...