内存管理

内存布局结构

iOS内存管理方案(objc-runtime-680)

  • TaggedPointer
  • NONPOINTER_ISA

  • 散列表


ARC

  • ARC是LLVM和Runtime协作的结果
  • ARC中禁止手动调用retain/release/retainCount/delloc
  • ARC中新增weak,strong关键字

引用计数管理




delloc实现:

obj_destructInstance()实现:

clearDeallocating()实现:

自动释放池(AutoReleasePool)

  • 以栈为结点通过双线链表的形式组合而成
  • 与线程一一对应
  • 在当次runloop将要结束的时候调用 AutoReleasePoolPage::Pop
  • 多层嵌套就是多次插入哨兵对象



AutoReleasePoolPage::Pop

  • 根据传入的哨兵对象找到对应位置
  • 给上次Push操作之后添加的对象依次发送release消息
  • 回到next指针到正确位置

循环引用

  • 自循环引用
  • 相互循环引用
  • 多循环引用

如何破除循环引用

  • 避免产生循环引用
  • 在合适时机手动打破循环引用

具体解决方案

  • __weak
  • __block
  • __unsafe_unretained(会产生悬垂指针)

Note:

  • MRC下,__block修饰对象不会增加引用计数,避免了循环引用
  • ARC下,__block修饰对象被强引用,无法避免循环引用,需要手动解环

NSTimer循环引用问题