内存管理初期

来源:互联网 发布:排华法案 知乎 编辑:程序博客网 时间:2024/04/28 09:43

一.

1.游戏中,植物大战僵尸的尸体和开心消消乐的方块都去哪里了?

        每一个尸体和方块都是一个对象。既然是对象,系统就会分配内存。应用程序使用内存,超过这个内存空间,程序就会被这个系统主动关闭。


2.为什么要使用内存管理?

      应用程序崩溃,90%以上的bug都是内存问题引起的。了解内存管理里,能够减少程序的出错几率。出现内存问题一般有两个方面:

(1)内存溢出 :内存溢出就是超出了给你限定的内存区域导致的问题,就跟用容器装水一样,超出容器的水就会溢出。


(2)野指针访问:对象的内存空间已经被系统收回,仍然使用指针操作这块内存。也指针操作是引起程序crash的主要原因。代码量越大越难找出野指针的位置。



3.那么我们如何管理内存呢?

     解决方案就是有创建就有销毁

      所谓的内存管理就是对象的创建和销毁进行管理。

4.内存管理的方式:

(1)垃圾回收(Java,C#,C++,OC(只支持Mac OS))

(2)手动管理内存:

         C语言:malloc,freee;

         OC:MRC(Manual Reference Count)手动 引用 计数

(3)自动管理内存:

ARC(Auto Reference Count)自动 引用计数  iOS 5之后的新特性,并不是垃圾回收。



4.垃圾回收机制:

程序员只需要开辟内存空间,不需要用代码进行释放,系统来判断哪些空间不再被使用,并回收这些内存空间,以便再次分配。整个回收过程不需要写任何代码,有系统自动完成垃圾回收。Java开发过程就是使用这种垃圾回收机制。


5.MRC:

手动引用计数:

内存的开辟和释放都需要程序的代码控制。相对于垃圾回收机制,MRC对内存的控制更加灵活,可以在需要释放的时候及时释放。对程序要求极高,需要熟悉内存管理机制。


6.ARC:

自动以用机制:至开辟空间,不去释放。他不是垃圾回收机制,它的本质还是MRC,只是便一起帮程序员默认加入了释放的代码。


iOS的内存管理:iOS支持3种内存管理方式:MRC,ARC,垃圾回收(Mac OS).

                            MRC的内存管理机制是:引用计数机制

                            ARC是基于MRC的。

二.内存管理机制

引用计数:OC采用“引用计数机制”,管理对象占用内存。实际开发过程中,经常会遇到多个指针使用同一块内存的情况,C语言无法记录内存使用者的个数。


计数:计数器,用于统计数字,例如1,2,3,4,5...等


拥有者(owner):使用这块内存区域的对象叫做这块内存区域的拥有者。


NSObject类及其子类都有一个属性,用来记录当前对象的引用个数


OC采用引用计数机制管理内存,当一个新的引用指向对象时,引用计数器就+1,当不再使用的时候,引用计数就-1.当引用计数为0 的时候,该对象将释放所占有的资源。



7.影响引用计数的方法

(1)alloc:开辟内存空间,让被开辟的内存空间的引用计数变为1,这是由0到1的过程。

(2)retain:"持有"的意思。对系那个引用计数+1.拥有该对象的所有权。

(3)copy:把某一内存区域的内容拷贝一份,拷贝到新的内存空间去。被拷贝对象的引用计数不变,新的内存区域的引用计数变为1,拥有新的被copy出来对象的所有权。

(4)release:引用计数-1,并释放对象的所有权,如果以前引用计数为4,那么release之后引用计数为3.

(5)autorelease:未来的某一时刻-1,并放弃对象所有权。




8.dealloc:是继承父类(NSObject)的方法,当对象的引用计数为0的时候,有系统使用该对象的dealooc方法                 dealooc方法我们不要自己调用。


自动释放池

NSAutoreleasePool类

当你创建对象不想立即释放的时候可以使用autorelease,那么会把对象的所有权交给最近的NSAutoreleasePool对象

sutorleasePool控制,使用autorelease对象的是释放    这个对象何时释放取决于这个autoreasepool



8.内存管理原则:

凡是出现alloc,retain,copy的地方,都应该出现release或者autorelease与之对应

凡是出现了alloc,retain或者copy让内存的引用计数增加了,就需要使用release或者autorelease让内存的引用计数减少。在一块代码内,增加和减少的次数要相等。



9.copy:

想要copy一个对象,也就是生成一个副本,需要先遵循NSCcopying协议,NSCopying协议中有一个必须实现的协议方法。如果没有遵循NSCopying,或者没有实习里面的协议方法,就会导致崩溃。我们需要在copyWithZone这个方法中定义copy的细节。



0 0