iOS 内存管理

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW8yMjE4ODk3,size_16,color_FFFFFF,t_70

 

1.内存布局

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW8yMjE4ODk3,size_16,color_FFFFFF,t_70

 

堆栈:方法调用

堆:通过ALLOC等分配的对象

BSS:未初始化的全局变量等

数据:已初始化的全局变量

文本:程序代码

2.内存管理方案

TaggedPointer:小对象(NSNumber)

(非指针型isa)NONPOINTER_ISA 64位架构iOS应用占用64位,本身32 40就够用,为了提高内存利用,剩余比特位存储内存管理相关内容

散列表复杂的结构,弱引用表,引用计数表

NONPOINTER_ISA:

第一位索引0代表指针型isa

第二位has_assoc 1代表有关联对象

第三位has_cxx_dtor表示是否用c ++ arc中也可以表示是否arc管理

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW8yMjE4ODk3,size_16,color_FFFFFF,t_70

 

weakly_referenced:这个对象是否有弱引用指针

取消分配:当前对象是否再进行dealloc的操作

has_sidetable_rc:当前引用计数达到上限,外挂sidetable数据结构去存储相关引用计数内容

extra_rc:额外的引用计数,计数很小就存在这里面

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW8yMjE4ODk3,size_16,color_FFFFFF,t_70

散列表:

SideTables()结构

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW8yMjE4ODk3,size_16,color_FFFFFF,t_70

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW8yMjE4ODk3,size_16,color_FFFFFF,t_70

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW8yMjE4ODk3,size_16,color_FFFFFF,t_70

3.数据结构

自旋锁:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW8yMjE4ODk3,size_16,color_FFFFFF,t_70

RefcountMap:2018121623150492.png

为size_t:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW8yMjE4ODk3,size_16,color_FFFFFF,t_70

weak_table_t:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW8yMjE4ODk3,size_16,color_FFFFFF,t_70

 

4.ARC

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW8yMjE4ODk3,size_16,color_FFFFFF,t_70

5.应用计数管理实现原理

alloc:经过一系列调用,最终调用了c函数calloc,此时并没有设置引用计数为1

retain:

           SideTable &table = SideTables()[this];

           size_t&refcntStorage = table.refcnts[this];

          refcntStorage += SIDE_TABLE_RC_ONE;

release:

           SideTable &table = SideTables()[this];

           RefcountMap::iterator it = table.refcnts.find(this);

          it->second -= SIDE_TABLE_RC_ONE;

retainCount:

         watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW8yMjE4ODk3,size_16,color_FFFFFF,t_70

dealloc:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW8yMjE4ODk3,size_16,color_FFFFFF,t_70

object_dispose()实现

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW8yMjE4ODk3,size_16,color_FFFFFF,t_70

objc_destructInstance()实现

 watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW8yMjE4ODk3,size_16,color_FFFFFF,t_70

clearDeallocating()实现

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW8yMjE4ODk3,size_16,color_FFFFFF,t_70

 

添加weak变量:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW8yMjE4ODk3,size_16,color_FFFFFF,t_70

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW8yMjE4ODk3,size_16,color_FFFFFF,t_70

6.自动释放池

是以栈为结点通过双向链表的形式组合而成       和线程一一对应

在当次runloop将要结束的时候调用autoreleasePoolPage::pop(),然后创建新的释放池

多层嵌套就是多次插入哨兵对象

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW8yMjE4ODk3,size_16,color_FFFFFF,t_70

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW8yMjE4ODk3,size_16,color_FFFFFF,t_70

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW8yMjE4ODk3,size_16,color_FFFFFF,t_70

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW8yMjE4ODk3,size_16,color_FFFFFF,t_70

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW8yMjE4ODk3,size_16,color_FFFFFF,t_70

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW8yMjE4ODk3,size_16,color_FFFFFF,t_70

7.循环引用

三种循环引用:自循环引用   相互循环引用   多循环应用

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW8yMjE4ODk3,size_16,color_FFFFFF,t_70

NSTimer 的循环引用

NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(timerRun) userInfo:nil repeats:YES];

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW8yMjE4ODk3,size_16,color_FFFFFF,t_70

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值