《新浪微博剖析 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