22、iOS底层探索-自动释放池

highlight: hybrid1、概述 OC 中的一种内存自动回收机制,它可以将加入AutoreleasePool中的变量release的时机延迟当创建一个对象,在正常情况下,变量会在超出其作用域时立即 release ,如果将其加入到自动释放池中,这个对象并不会立即释放,而会等到 runloop 休眠 / 超出autoreleasepool作用域之后进行释放 从程序启动到...

iOS底层原理之方法调用的底层探究

本文主要内容1、objc_msgSendSuper解析 \2、方法的快速查找 \3、方法的慢速查找算法 \4、方法的慢速查找流程 \5、总结 前言在iOS底层原理之cache详解文章中,我们了解到了cache,知道了insert操作,那么既然有存储的操作,就会有取的操作.在objc4-838.1源码的cache源码中(62行)发现,编译器从cache中调用方法要用到objc_...

iOS底层探索-界面优化

highlight: hybrid1、卡顿原理1.1、界面显示原理 CPU:Layout UI布局、文本计算、Display绘制、Prepare图片解码、Commit提交位图给 GPU GPU:用于渲染,将结果放入 FrameBuffer FrameBuffer:帧缓冲 Video Controller:根据Vsync(垂直同步)信号,逐行读取 FrameBuffer 中的数...

关于iOS CoreMIDI库中MIDIServices 相关API解读

关于iOS CoreMIDI库中MIDIServices 相关API解读一.获取可用MIDI列表// 获取可用MIDI列表的数量ItemCount deviceCount = MIDIGetNumberOfDevices();​// 遍历MIDI列表,可以获取到设备for (ItemCount i = 0 ; i < deviceCount ; ++i) { MIDID...

OC底层探索 - block

block的类型block有三种类型: 栈block(NSStackBlock)、堆block(NSMallocBlock)、全局block(NSGlobalBlock)。 void (^ block)(void) = ^{};NSLog(@"%@",block); // <__NSGlobalBlock__: 0x107b810e0>int a = 1;void...

19、iOS底层探索-Clang插桩

highlight: hybrid在上篇 启动优化 中我们最后使用二进制重排方法,将启动相关的符号方法提前加载到内存,从而减少 缺页中断(Page Fault) 来提高启动速度,但我们如何确定需要将哪些方法提前呢?本篇就来介绍寻找这些符号的方法 — Clang插桩 1、Clang插桩配置 LLVM 内置了一个简单的代码覆盖率检测工具(SanitizerCoverage),它在 ...

iOS底层源码分析启动流程

一、课程引入创建一个工程,在ViewController中重写load方法,在main中加了一个C++方法mideaCXXFun,同时在load方法、mideaCXXFun和main方法中添加log日志,下面我们来执行此demo,看一下log日志的打印结果: 从打印的日志可以看到执行的流程如下: 带着这些疑问,开始进入iOS底层源码启动流程的探索!!! 二、编绎过程和库编...

OC总结 - 锁

什么是线程安全?多线程操作共享数据的时候不会出现意想不到的结果就叫线程安全,否则就是线程不安全。 原子属性是线程安全的吗?原子属性只能保障set 或者 get的读写安全,但我们在使用属性的时候,往往既有set又有get,所以 说原子属性并不是线程安全的。 自旋锁 & 互斥锁自旋锁: 在访问被锁的资源的时候,调用者线程不会休眠,而是不停循环在那里,直到被锁资源释 放锁。(...

OC底层探索 - @synchronized

NSObject *obj = [NSObject new];@synchronized (obj) { printf("HHHHH");} 把 @synchronized 代码转换成 C++ 代码 { id _rethrow = 0; id _sync_obj = (id)obj; objc_sync_enter(_sync_obj); try ...

OC底层探索 - 多线程 & GCD

线程与进程线程 进程 一个CPU核心同一时刻只能执行一个线程。当线程数量超过CPU核心数量时,一个CPU核心往往就处理多个线程,这个行为就叫做 线程调度。就是一个CPU核心轮流让各个线程分别执行一段时间。CPU在多个线程任务中进行快速的切换,这个时间间隔就是 时间片。 通过线程调度,我们可以知道问什么不推荐我们开辟过多的线程了 CPU核心有限,而线程调度时的线程切换是耗时的,每...