iOS16之后新加的内容

iOS16之后才加入了关于协议一致性的磁盘缓存,而在 iOS 15 的 Swift Runtime 中,findConformanceWithDyld 方法内部并没有 onDisk 方法簇的调用

dyld 关于协议一致性的内存缓存也是在 Swift 5.4 加入的

在Objective-C中,几乎所有的方法调用都会转化为消息发送,而消息发送的必经之路就是objc_msgSend,而消息转发中的 objc_msgSend函数是基于汇编实现的,那么为什么apple要采用这样的方案设计呢?

原因有两点:

1.无法通过C语言来实现一个具有保留未知参数并且可以跳转到任意函数指针的函数;

2.objc_msgSend 的执行速度非常重要,所以它的每一条指令都要尽可能的高效让能尽可能更快的运行。

TLS: Thread Local Storage 线程局部存储,其目的是将一块内存作为某个线程专有的存储,以key-value 的形式进行读写。

在返回值身上调用objc_autoreleaseReturnValue 方法时,runtime将这个返回值object储存在TLS中,

然后直接返回这个 object(不调用 autorelease);同时,在外部接收这个返回值的 objc_retainAutoreleasedReturnValue 里,发现 TLS 中正好存了这个对象,那么直接返回这个 object(不调用 retain)。 于是乎,调用方和被调方利用 TLS 做中转,很有默契的免去了对返回值的内存管理。

在 objc4 之前,objc_autoreleaseReturnValue / objc_retainAutoreleaseReturnValue 会将传入的 obj 利用 TLS 存储,在 objc_retainAutoreleasedReturnValue / objc_unsafeClaimAutoreleasedReturnValue 中 根据 key 拿到原来的 objc 进行比较,如果相同就什么都不做。 objc4 做了优化,不再存储原始 obj,objc_autoreleaseReturnValue / objc_retainAutoreleaseReturnValue 只存储了一个标志位 ReturnDisposition,objc_retainAutoreleasedReturnValue / objc_unsafeClaimAutoreleasedReturnValue 根据标志位来进行判断是否需要 retain 或 release。

你可能感兴趣的:(swift,objective-c,iOS16)