Core Animation 与 RunLoop
Core Animation 是一个动画框架,它基于 OpenGL、Core Graphics 和其他低级图形技术构建的,它负责提供一个高性能的动画层。
RunLoop 是一个事件处理循环,用于在程序中管理输入、定时器事件和其他类型的事件。RunLoop 的主要作用是保持程序的持续运行,同时在没有事件处理时让程序进入休眠状态,从而节省 CPU 资源。
Core Animaton 与 RunLoop 的关系如下:
- 刷新屏幕与异步绘制:Core Animation 可以在后台线程上预渲染动画的帧,然后将这些帧提交给 RunLoop,以便在适当的时候进行屏幕的刷新
- 定时器:Core Animation 使用 RunLoop 的定时器来驱动动画
递归锁
iOS 中的递归锁是 NSRecursiveLock,它的底层实现细节没有公开,但可以根据递归锁的一般原理来推测其可能的实现方式。
递归锁的核心特性是它能够被同一线程多次获取而不会导致死锁。为了实现这一点,递归锁内部可能维护了一个锁计数器和一个所有者标记。
- 如果线程已经持有锁(通过所有者标记检查),则锁计数器增加,锁的获取操作成功
- 如果线程没有持有锁,但锁当前可用,则线程称为新的所有者,锁计数器设置为1
- 如果线程没有持有锁,且锁被其他线程持有,则当前线程会阻塞,直到锁被释放
defer
在 Swift 中,defer 语句用于在代码块退出之前执行一些清理工作。当前作用域结束调用,无论函数是正常执行完毕还是发生异常而提前退出,defer 定义的代码块都会被执行且仅会被执行一次。
以下是一些常见的使用场景:
- 文件操作:当你打开一个文件进行读写操作时,你可用在打开文件后立即使用 defer 语句来关闭文件,确保无论函数如何退出,文件最终都会被关闭
- 解锁互斥锁:当你使用互斥锁来保护共享资源时,可用使用 defer 语句来确保锁在代码块结束时总是被解锁,即使代码块中发生了异常