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

tags: OC 30 day


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

内存管理是什么?

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

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

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

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

内存的五大区域

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,代表这个对象多一个人使用。当这个对象少一个人使用的时候,应该让这个对象的养用计数器减1,代表这个对象少一个人使用。当这个对象的引用计数器变回0的时候。代表这个对象没人使用。这个时候系统就会自动回收这个对象。

如何操作引用计数器?

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

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

内存管理的分类

MRC:手动引用计数。

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

ARC:自动引用计数。

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


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章