@iwanglong
2019-02-20T01:23:17.000000Z
字数 838
阅读 276
内存管理
iOS
内存布局
- stack(栈区):方法调用
- heap(堆区):通过alloc等分配的对象
- bss :未初始化的全局变量等
- data:已经初始化的全局变量等
- text:程序代码
内存管理方案
- TaggedPointer ()
- NONPOINTER_ISA (64架构,非指针型isa)
- 散列表 (弱引用表)
数据结构
- Spinlock_t 自旋锁
- RefcountMap (引用技术表)
- 用hash表实现,提高查找效率,插入以及查找是一个函数实现,,避免循环遍历
- weak_table_t (弱引用表)
ARC & MRC
- MRC 手动引用计数
- ARC 自动引用计数
- ARC 是编译器(LLVM)和Runtime协作的结果
- ARC中禁止手动调用retain/release/retainCount/dealloc
- ARC中新增weak、strong属性关键字
引用计数管理
- 实现原理分析
- alloc
- 经过一系列调用,最终掉一共C函数calloc
- 此时并没有设置引用计数为1
- retain
- release
- retaincount
- dealloc
弱引用管理
weak_register_no_lock()weak_clear_no_lock()
通过hash算法来查找被废弃对象在弱引用表位置,提取所对应的弱指针数组,然后for循环将对象置为nil;
自动释放池
- 什么是自动释放池 | Autoreleasepool的实现原理
- 是以栈为节点通过双向链表的形式组合而成的数据结构。
- 是和线程一一对应的。
循环引用
- 自循环引用
- 相互循环引用
- 多循环引用
- 解除循环引用方法
- __weak
- __block
- MRC下,__block修饰对象不会增加引用计数
- ARC下,__block修饰对象会被强引用,需要手动解除
- __unsafe_unretained
- 修饰对象不会增加引用计数,避免循环引用
- 如果被修饰对象在某一时机被释放,会产生悬垂指针!不建议使用
- NSTimer的循环引用