Objective-C----内存管理

简述OC中内存管理机制

       1、OC的内存管理机制是自动引用计数,内存管理的原则是谁开辟谁释放,有retain的地方就要有release

         2、内存管理分为ARC和MRC,ARC下则一般不需要我们手动管理,系统会在适当的位置加上内存管理关键字。在MRC下我们需要手动管理内存,需要使用到retain/copy/release/autorelease等方法实现内存管理。具体如下:

(1)如果使用 alloc、copy(mutableCopy)或retian 一个对象时,你就有义务,向它发送一条 release或 autorelease 消息。
(2)向一个对象发送一条 autorelease 消息,这个对象并不会立即销毁, 而是将这个对象放入了自动释放池,待池子释放时,它会向池中每一个对象发送 一条 release 消息,以此来释放对象。 
(3)向一个对象发送 release 消息,并不意味着这个对象被销毁了,而是当这个对象的引用计数为 0 时,系统才会调用 dealloc 方法,释放该对象和对象 本身它所拥有的实例。

       3、retain是引用计数+1, 在内存管理中, 要记得内存管理原则: 谁开辟谁释放, 有retain就要有release.  release是引用计数-1. alloc匹配的是dealloc, alloc是开辟内存空间, dealloc是销毁所开辟的内存, 有开辟就要有销毁.

-------------------------------------------------------------------------------------------------------------------
下面是对内存、引用计数等概念的介绍
内存简介:
       iOS系统给每个运行的软件一块内存空间(虚拟空间)。应用程序使用内存超过这个内存空间,程序就会被系统主动关闭。

为什么要使用内存管理?
    应用程序崩溃,%90以上的bug都是内存问题引起的。理解内存管理的原则,能够减少我们程序出错的机率
  出现内存问题主要有两个方面:

    1、内存溢出
     概念:iOS给每个应用程序提供了一定的内存,iPhone 3GS的内存30M左右,iPhone 5S的内存80M左右,一旦超出内存上限,程序就会被crash(崩溃,闪退)  
    程序开发过程中最占用内存资源的是图片,音频,视频等资源文件。3.5寸非Retina屏幕的像素是320 * 480,而一张全屏的图片所占用的内存是(320 * 480 *4 = 614400字节 614400字节/1024 = 600KB   )(一个像素占4个字节,存放RGBA),那么同时读取30张图片就会崩溃。
    3.5Retina屏幕的像素是320 * 2 * 480 * 2
    一张全屏图片所占内存空间,320 * 2 * 480 * 2 * 4 = 2457600  2.4M
    内存溢出也就是超出了给你限定的内存区域导致的问题,就跟容器装水一样,超出容器的水就会溢出
        
    2、野指针
     对象的内存空间已经被系统回收,荏苒使用使用指针操作这块内存。野指针操作是允许程序Crash的主要原因。代码量越大,越难找出野指针的位置。
    了解内存管理能帮我们提升程序的性能,减少bug调试时间

如何管理内存
   解决方案:对象有创建就要有销毁
    所谓的内存管理就是对对象的创建和销毁过程进行管理
       内存管理的方式

   1、垃圾回收机制GC:
     (JavaC#C++OC(只支持Mac OS;apple移动手机端没有))有垃圾回收机制;
     程序猿只需要开辟空间,不需要用代码进行释放,系统来判断那些空间不再被使用,并回收这些内存空间,以便再次分配。整个回收过程不需要写任何代码,由系统自动完成垃圾回收。  --- Java一直使用的便是垃圾回收机制
   
   2、手动管理内存:MRC (Manual Reference Count)手动引用计数
      内存的开辟和释放都由出现的代码控制。相对垃圾回收机制,MRC堆内存的控制更加灵活,可以在需要释放的时候及时释放,对程序猿要求较高,程序猿需要熟悉内存管理机制。

   3 、自动管理内存
ARC:(Auto Reference Count自动引用计数 ;ARCiOS5之后的新特性,并不是垃圾回收
    iOS 5.0的新特性编译器,它只允许用户开辟空间,不用去释放空间。它不是垃圾回收,它的本质还是MRC,只是编译器帮程序猿默认添加了释放的代码。

  iOS的内存管理
      iOS支持三种内存管理方式,MRCARC,垃圾回收(Mac OS);
      MRC的内存管理机制是ARC引用计数机制。
      ARC是基于MRC;
内存管理机制 
   引用计数
      OC采用的引用计数机制管理对象所占用得内存
      实际开发中,经常遇到多个指针使用同一块内存地址的情况。C语言无法记录内存使用者的个数
      计数:计数器用于统计数字:012345………………
      引用计数:记录某一块内存区域,拥有这块内存区域拥有者(owner)的个数
       拥有者(owner):使用这块区域的对象就叫做拥有者
        
      NSObject类及其子类都有一个属性,用来记录当前对象的引用计数
      OC采用引用计数机制管理内存,当一个新的引用指向对象时,引用计数器就+1,当不再使用的时候,引用计数就-1;当引用计数为0的时候,该对象将释放所占有的资源。

生命周期 
     实例对象的生命周期生成alloc方法    结束dealloc方法
     通过对类发送alloc消息获得的实例对象引用计数赋值 1。当实例对象引用计数为0的时候,这都给该对象发送dealloc消息
        
影响引用计数的方法
     alloc:开辟内存空间,让被开辟的内存空间的引用计数变为1,这是从01得过程
     retain持有,对象的引用计数+ 1,拥有该对象的所有权。如果对象原来引用计数为1,那么引用计数是2,如果引用实现是5retain之后遍6
        
     copy:把某一块内存区域的内容拷贝一份,拷贝到新的内存空间里去,被拷贝 的对象的引用计数不变,新的内存区域的引用计数变为1,拥有新的被copy出来的对象的所有权    
     release:引用计数减1,并释放对象的所有权,如果之前引用计数为4release之后引用计数变成3
     autorelease
        dealloc
   
      
是继承(NSObject)的方法,当对象的引用计数为0时,系统就使用该对象调用dea
lloc方法
       
自动释放池
         NSAutoreleasePool类
         当你创建对象,不想立即释放的时候可以使用NSAutoreleasePool,那么会把对象所有权交给最近的NSAutoreleasePool对象
         autoreleasePool控制使用autorelease对象的释放。
         这个对象合适释放,取决于这个autoreleasePool
      
copy  
        想要copy一个对象,也就是生成一个副本。想要先遵循NSCoping协议,NSCoping协议中,有一个必须实现的协议方法,如果没有遵循NSCoping协议,或者没有实现里边的协议方法,就会导致崩溃,我们需要在copyWithZone方法中,定义copy的细节实现
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值