在分类中不能添加属性,但是却可以使用 关联对象的方式,给类添加变量。主要重点是: 关联对象的实现方式。 关联对象散列表的存储和查找逻辑 关联对象的设置,以及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]));
}
}
方法查找流程 lookUpImpOrForwardobjc的方法调用底层时消息的发送,调用objc_msgSend的方法。之前分析过 objc-msg-x86_64.s 汇编文件学习[https://www.jianshu....
类的 methodlist 是一个二维数组, 每一个分类的methods 是一个一维的数组,每次添加分类的方法是,都会添加到类的methodlist的数组中去。同样对于 runtime的addMethod 方法,也是添加一个数组到二维数组中。对于同名方法 是不会再同一个一维数组之中的,这是根据分类的加载顺序确定的。
方法查找流程 lookUpImpOrForwardobjc的方法调用底层时消息的发送,调用objc_msgSend的方法。之前分析过 objc-msg-x86_64.s 汇编文件学习[https://www.jianshu....
block 经常被用到,那么再底层它是如何被实现的,以及 相关的变量捕获和__block 是怎么处理的呢 准备工作 clang 命令,将.m 转称.cpp libclosur...
os_unfair_lock #import <os/lock.h> os_unfair_lock 是用来替代 OSSPinLock 的一个互斥锁。OSSpinLock 是采...
同步 多线程操作访问修改统一资源会产生混乱的情况,使用同步工具来了防止不同的线程意外更改数据。 同步基本使用下面几种方式 锁 原子操作 内存壁垒和易失性变量 原子操作,是一种...
GCD 调度队列是一个类似对象的结构,用于管理您提交给它的任务。所有调度队列都是先进先出数据结构。因此,添加到队列中的任务始终以与添加任务相同的顺序启动。 在当前的OS X和...
在分类中不能添加属性,但是却可以使用 关联对象的方式,给类添加变量。主要重点是: 关联对象的实现方式。 关联对象散列表的存储和查找逻辑 关联对象的设置,以及retain/re...