内存管理

来源:互联网 发布:徐州专业淘宝摄影 编辑:程序博客网 时间:2024/05/16 09:25

内存管理介绍:

      比如职务大战僵尸的游戏或者开心消消乐,每一个僵尸在程序中就是一个对象,每一个方块也就是一个对象,既然对象系统就会自动分配内存(对内存)

      那么死去的僵尸和消除的方块应该如何处理

      iOS系统会给每一个运行的软件一块内存空间

      应用程序使用内存超过这个内存空间,程序就会被系统主动关闭

      为什么要使用内存管理?

      应用程序崩溃90%以上的bug都是内存问题引起的,了解内存管理的原则,能够减少我们程序出错的几率

      

      出现内存问题一般有来个方面:

      1.内存溢出

      2.野指针访问

      

      内存溢出:iOS给每个应用程序提供了一定的内存,iPhone3gs系统分配了30m的内存,一旦超出内存上限,程序就会crash(崩溃,闪退)

      

      

      程序开发过程中最占内存资源的事图片/音频/视频等资源文件

      3.5寸非Retina屏幕,他的像素是320*480,而一张全屏的图片所占的内存(320*480*46144001024600kb)(一个像素占4个字节,存放rgba)那么同时读取30m的图片就会崩溃

      3.5Retina屏幕  640*960

      一张图片所占内存空间640*960*4=24576001024=2400kb

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

      野指针的异常:

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

      了解内存管理能够帮我们提升程序的性能,减少bug调试时间

      那么我们如何管理内存

      有创建就要有销毁(谁创建,谁销毁)

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

      内存管理方式:

      垃圾回收(java  c#c++oc(只支持mac os

      手动管理内存()

      c语言:mallocfree

      ocMRCmanual reference  count)手动引用 计数

      自动清理内存ARCauto reference count)自动 引用  计数,iOS5之后的新特性,并不是垃圾回收机制

      垃圾回收机制

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

      MRC,人工手动引用记数,内存的开辟和释放都有程序的代码控制,相对于垃圾回收机制,MRC对内存的控制更加灵活,在需要时释放的时候及时释放。对程序员要求较高,需要熟悉内存管理机制

      ARC

      自动引用计数:iOS5的编译器的新特性,只允许用户开辟空间,不用去释放空间,他不是垃圾回收机制,他的本质还是MRC,只是编译器棒程序猿默认加入了释放的代码

      

      

      iOS内存管理

      iOS支持三种内存管理方式:MRCARC,垃圾回收(Max os

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

      ARC是基于MRC

      ********************

      

     二:内存管理机制

      引用计数:oc采用引用计数机制管理对象所占内存

      实际开发中会遇到多个指针使用同一块地址的情况,c语言无法记录内存使用者的个数

      

      计数:用于统计数字

      引用计数:某一块内存,拥有这块内存的拥有者个数(owner):使用这块内存区域的对象就叫拥有者

      注意:nsobject类以及子类都有一个属性,用来打印当前对象的引用计数

      OC采用引用计数机制管理内存,当一个新的引用指向对象是,引用计数器就+1,当不再使用的时候,引用计数就减一。

      当引用计数为0的时候,该对象将释放所占有的资源。

      三:生命周期

      实例对象的生命周期

      出生于:alloc

      死亡与:dealloc

      通过对类发送alloc消息获得实例对象的引用计数赋值为1

      当实列对象引用计数为0的时候,自动对该对象发送dealloc消息

      影响引用计数的方法:(+类方法  -  实列对象方法)

      +alloc  开辟内存空间,让被开辟的内存空间的引用计数变为01

      -retain ”持有对象引用计数+1,拥有该对象的所有权 如果对象引用计数原来是1,那么retain之后,就位2,,,依次+1.。。

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

      -release  引用计数-1,并示释放对象的所有权,如果之前,引用计数为4release之后,引用计数变为3

      autorelease  未来的某一时刻引用计数-1;并放弃对象的所有权

 /**

         dealloc 是继承父类nsbject的方法,当对象的引用计数为0的时候,有系统使用该对象调用dealloc方法,

         dealloc  方法我们不要自己调用

         

         */

   /***

        //自动释放池

        NSAutoreleasePool

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

      

    AutoreleasePool控制使用Autorelease对象的释放

    这个对象何时释放取决于这个AutoreleasePool

    

/****

        //内存管理原则

        

        凡是出现alloc,retain .copy 的地方都应该出现release或者autorelease与之对应 在一段代码,增加和减少的次数要相等

      属性为retaincopy的时候,需要在类的dealloc方法中释放

      便利构造器本身包含autorelease

        

        

      ***/

        /**

           copy

         

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

         //当对象执行copy方法是,会执行copyWithZone方法

         - (id)copyWithZone:(NSZone *)zone{

         //创建一个新的同类型的对象

         Person *person=[[Person alloc]init];

         //copy对象的值,赋值给新创建的实列对象,即完成了copy方法

         person.name=self.name;

         person.sex=self.sex;

         

         return person;

         }




      


0 0
原创粉丝点击