《新浪微博剖析 iOS 高级面试》笔记(四):内存管理相关面试问题
内存布局
- stack:方法调用。
- heap:通过alloc等分配的对象。
- text:程序代码。
- bss:未初始化的全局变量等。
- data:已初始化的全局变量等。
内存管理方案
1、散列表结构
2、SideTable结构
3、为什么不是一个SideTable,而是SideTables?
- 因为修改数据时会加锁,如果所有对象的表放在同一个sideTable,那么加锁会太频繁,效率会受影响。
- 因为有多个SideTable,所以可以异步操作多张表,彼此之间影响会降低。
4、怎样实现快速分流(怎样通过一个对象快速定位它所在的表)?
- SideTables的本质是一张
Hash表
。 Hash表
查找的时间复杂度为O(1)
。- 通过
对象地址
与Hash表
的count
取模
,获取目标值下标索引。
数据结构
1、自旋锁 Spinlock_t
2、引用计数表 size_t
- 引用计数表是通过
Hash表
来实现的。 Hash表
查找的时间复杂度为O(1)
。
3、弱引用表 weak_table_t
ARC & MRC
1、retain实现
2、release实现
3、retainCount实现
4、dealloc实现
4.1、object_disponse()实现
4.2、cleanDeallocating()实现
弱引用管理
1、弱引用变量如何被添加到弱引用表中?
2、当一个对象被释放,weak变量是如何处理的?
- 根据
对象
,查找到弱引用表
,提取弱引用数组
。 - 遍历其中所有
弱引用指针
,并置为nil
。
自动释放池
- autoreleasepool的实现原理是怎样的?
- autoreleasepool为何可以嵌套使用?
循环引用
内存管理面试总结
- 什么是ARC?
- 为什么weak指针指向的对象在废弃之后会被自动置为nil?
- autoreleasepool是如何实现的?
- 什么是循环引用?你遇到过哪些循环引用?是如何解决的?
转载自:https://juejin.cn/post/6901202735043969032