iOS APP 开发 OC 第十七天,内存管理&引用计数器(重要观念)

tags: OC 30 day


开发一个项目,内存管理最直接影响一个项目的品质。意味着一个好的内存管理会让项目的运行效率优良;反之,效能不好,还有可能导致项目崩溃。

内存管理是什麽?

内存的作用,就是储存数据。

  1. 如何将数据储存到内存当中。
  2. 当数据不再被使用的时候,占用的内存空间如何被释放。

如何将数据储存到内存当中?

声明一个变量,然後将数据储存进去。

内存的五大区域

stack:

局部变量,当局部变量的作用预备执行完毕之後,这个局部变量就会被系统立即回收。

heap:

OC对象。使用C函数申请的动态空间。

BSS(Block Started by Symbol):

未初始化的全局变量,静态变量。一但初始化就回收,并转存到数据段之中。

数据段:

已经初始化的全局变量,静态变量,直到程序结束得时候才会被回收。

代码段:

代码,程序结束得时候,系统会自动回收储存在代码段的数据。

stack,BSS,数据段,代码段的数据回收是由系统自动完成的,不需要我们干预。

BSS是什麽?
因为宣告一段空间很快
而且又不是动态的
在程序一开始时就allocate一段空间
但是如果都要先初始化成某个值,那就消耗资源
如果你宣告了很多
却都没使用
那就浪费资源
所以,先画出来范围

分配在heap中的OC对象,是肯定要被回收的

iphone内存机制,如果一个APP占用的内存超过40M,就会收到一个警告。45M,又会收到第二个警告。如果超过120M,APP就会直接闪退。

储存在heap的OC对象,系统不会自动回收,直到程序结束时才会被回收。

我们要注意的是,Stack的记忆体回收,其他的系统会自动回收。

对象应该要什麽时候回收?

当有人在使用这个对象的时候,这个对象就不能回收。
只有在没有任何人使用这个对象的时候,才可以回收。
那麽我们要如何知道这个对象有没有人在使用呢。
我们今天的主角除来啦?

引用计数器

每一个对象都有一个属性,叫做retainCount。叫做引用计数器。类型是unsigned long 占据8个字节。引用计数器的作用:用来记录当前这个对象有多少个人在使用它。

  1. 默认情况下,创建一个对象出来,这个对象的引用计数器的默认值是1。
  2. 当多一个人使用这个对象时,应该先让这个对象的引用计数器加1,代表这个对象多一个人使用。
  3. 当这个对象少一个人使用的时候,应该让这个对象的养用计数器减1,代表这个对象少一个人使用。
  4. 当这个对象的引用计数器变回0的时候。代表这个对象没人使用。这个时候系统就会自动回收这个对象。

如何操作引用计数器?

  1. 为对象发送一条retain消息,对象的引用计数器就会加1 ,当多一个人使用对象的时候才会发。
  2. 为对象发送一条release消息,对象的引用计数器就会减1 ,当少一个人使用对象的时候才会发。
  3. 为对象方送一条retainCount消息,就可以去到对象的引用计数器的值。
  4. 当引用计数器变为0的时候,对象就会被系统立即回收。

在对象回收的时候,会自动调用对象的dealloc方法。

内存管理的分类

MRC:手动引用计数。

手动内存管理
当多一个人使用对象的时候,手动发送retain消息;少一个人使用时,手动发送release消息。

ARC:自动引用计数。

自动内存管理
系统自动在合适的地方发送retain与release消息。


<<:  10个最佳Windows档案总管的提示和技巧

>>:  菜鸟新人第七十五天

Spring Boot定时任务排程器(DAY13)

我: 哇~ 同学你有好多资源是怎麽来的啊? 同学: 你猜猜看,猜错的话我就要检查你大脑发育有没有正常...

Day 03 : ML in Production 的挑战

在 Day2 提到什麽是用於生产的机械学习 ML in Production ,今天来谈用於生产的机...

网路是怎样连接的(十)UDP简介

思考重点 为甚麽要设计UDP? UDP对比TCP的优势? 核心知识 UDP与TCP的差别 众所皆知,...

成为工具人应有的工具包-29 TurnedOnTimesView

TurnedOnTimesView 今天来认识看看这个看名字我也不清楚是啥? 打开时间线? 喔!用时...

[DAY7]将范例上传(1)

上传LINE提供的范例回声机器人 第一步:先至LINE提供的GITHUB位置下载其资料夹,此处我们用...