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消息。