美文网首页
内存管理

内存管理

作者: iOS最新面试题收录 | 来源:发表于2019-08-24 21:56 被阅读0次

欢迎大家来我们的iOS交流社区,一起来交流学习,我会定期分享一些我学习ios开发 主要逆向安防、架构设计、多线程,网络进阶,还有底层 的学习的资料

加微信邀请你加入 15388944845

image

1、内存布局

image
  • stack:方法调用
  • heap:通过alloc等分配内存
  • bss:未初始化的全局变量等
  • data:已初始化的全局变量等
  • text:程序代码

2、内存管理方案

  • TaggedPointer
  • NONPOINTER_ISA
  • 散列表

散列表

image

3、数据结构

  • Spinlock_t "忙等"锁,轻量访问
  • RefcountMap
image

size_t

image
  • weak_table_t
image

4、MRC / ARC

  • MRC alloc/retain/release/retainCount/autorelease/dealloc
  • ARC LLVM和Runtime协作; ARC中禁止手动调用retain/release/retainCount/dealloc; 新增strong/weak属性关键字

5、引用计数

  1. alloc,最终调用calloc,此时引用计数为0
  2. retain实现
SideTable& table = SideTables()[this];
size_t& refcntStorage = table.refcnts[this];
refcntStorage += SIDE_TABLE_RC_ONE;
  1. release实现
SideTable& table = SideTables()[this];
RefcountMap::iterator it = table.refcnts.find(this);
it->second -= SIDE_TABLE_RC_ONE;
  1. retainCount实现
SideTable& table = SideTables()[this];
size_t refcnt_result = 1;
RefcountMap::iterator it = table.refcnts.find(this);
refcnt_result += it->second >> SIDE_TABLE_RC_SHIFT;

  1. dealloc
image

object_dispose()

image

objc_destructInstance()

image

clearDeallocating()

image

6. 弱引用

{
    id __weak obj1 = obj;
}

{
    id obj1;
    objc_initWeak(&obj1, obj);
}
image

7、自动释放池

void *ctx = objc_autoreleasePoolPush();
...
objc_autoreleasePoolPop(ctx);
void *objc_autoreleasePoolPush(void) <=> void *AutoreleasePoolPage::push(void)

void objc_autoreleasePoolPop(void* ctx) <=> AutoreleasePoolPage::pop(void* ctx)
  • 以栈为结点通过双向链表的形式组合而成
  • 和线程一一对应
image image
  • RunLoop将要结束时调用AutoreleasePoolPage::pop()
  • 多层嵌套就是多次插入哨兵对象
  • for循环中含有内存消耗较大的场景时,如图片对象的创建,手动插入AutoreleasePool

8、循环引用

分类

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

存在的场景

  • 代理
  • Block
  • NSTimer
  • 大环引用

解决方案

  • __weak
  • __block: MRC下,__block修饰的对象不回增加引用计数,避免循环引用; ARC下,__block修饰的对象会被强引用,无法避免循环引用,需要手动解环
  • __unsafe_unretained:修饰对象不会增加引用计数,避免循环引用;但是被修饰对象被释放时,会产生悬垂指针

NSTimer循环引用问题

image

相关文章

  • iOS内存管理详解

    目录 block内存管理 autorelease内存管理 weak对象内存管理 NSString内存管理 new、...

  • 第10章 内存管理和文件操作

    1 内存管理 1.1 内存管理基础 标准内存管理函数堆管理函数虚拟内存管理函数内存映射文件函数 GlobalMem...

  • 操作系统之内存管理

    内存管理 包括内存管理和虚拟内存管理 内存管理包括内存管理概念、交换与覆盖、连续分配管理方式和非连续分配管理方式(...

  • JavaScript —— 内存管理及垃圾回收

    目录 JavaScript内存管理内存为什么需要管理?内存管理概念JavaScript中的内存管理JavaScri...

  • OC - OC的内存管理机制

    导读 一、为什么要进行内存管理 二、内存管理机制 三、内存管理原则 四、MRC手动内存管理 五、ARC自动内存管理...

  • 3. 内存管理

    内存管理 内存管理包含: 物理内存管理; 虚拟内存管理; 两者的映射 除了内存管理模块, 其他都使用虚拟地址(包括...

  • Go语言——内存管理

    Go语言——内存管理 参考: 图解 TCMalloc Golang 内存管理 Go 内存管理 问题 内存碎片:避免...

  • jvm 基础第一节: jvm数据区

    程序内存管理分为手动内存管理和自动内存管理, 而java属于自动内存管理,因此jvm的职能之一就是程序内存管理 j...

  • 内存管理

    内存管理的重要性。 不进行内存管理和错误的内存管理会造成以下问题。 内存泄露 悬挂指针 OC内存模型 内存管理是通...

  • 11-AutoreleasePool实现原理上

    我们都知道iOS的内存管理分为手动内存管理(MRC)和自动内存管理(ARC),但是不管是手动内存管理还是自动内存管...

网友评论

      本文标题:内存管理

      本文链接:https://www.haomeiwen.com/subject/tkkcectx.html