OC第七节 内存管理

1、内存管理只存在堆区域,针对的也是堆区域的对象。

  // iOS内存管理的方式是引用计数机制,分为MRC(人工引用计数)和ARC(自动引用计数)

  // 为什么要学习内存管理?每个应用程序所占用的内存空间都是一定的,那么过度使用内存,或者错误使用内存就会出现问题,导致程序崩溃,只开辟,不回收,可用内存空间就会越来越少,内存溢出。如果一块空间被回收后,再去访问,就会造成野指针异常,野指针,就是放荡不羁的指针。

 

    // 1、养成良好的内存管理习惯,可以从源头上避免内存问题的出现

    // 2、一旦出现内存问题,就能找到并解决。(调试BUG

 

    // 引用计数管理内存的理念是:通过控制内存或者对象的引用来实现生成、持有、释放、销毁对象的操作。

    // 1、生成,对象的引用从 0 1

    // 2、持有,增加一个引用,让对象的引用计数加 1

    // 3、释放,减少一个引用,让对象的引用计数减 1

    // 4、销毁,当对象的引用计数为0时,系统就会回收这块内存。

    

    // 当这块空间被系统回收后,就不能通过指针去访问这块内存了,容易造成野指针。

 

2、控制函数:

    ①. 生成  +(instancetype)alloc方法  开辟空间,将内存清零,同时将引用计数从 0 变为 1

    ②. 持有  retain方法,让对象的引用计数加 1  

    retainCount方法,查看引用计数

    ③. 释放  release  对象可以直接使用的方法,让对象的引用计数立即减 1

    autorelease  效果和release相当,但要在自动释放池释放后再减 

    ④. 当对象的引用计数为 1 后再执行 release 方法操作时就会将对象销毁,对象销毁后就不能再访问,不然就会造成野指针

 

3、注意事项:

    ①. 拷贝让新生成的对象的引用计数加 1 ,原对象的引用计数不变 

    ②. 要执行copy操作必须接受NSCopying协议,实现协议里的方法,定义细节

    ③. 一个类可以接受多个协议,协议与协议之间用逗号隔开,所有协议写在父类后面,用尖括号括起来

 

4、copy的三种分类

  ①. 伪拷贝:相当于没有拷贝,只是让外界的对象执行了一次retain操作;

  ②. 浅拷贝:拷贝的是地址,对象两个,公用一份内容,该变其中一个对象实例变量,另外一个也会访问到改变后的值,

    但是一定要注意,字符串如果指向常亮区,那么改值相当于重指向,并不会影响另外一个对象的值。

  ③. 一般的拷贝都是深拷贝,即拷贝后有两个对象,两份内容,不会相互影响。

 注:拷贝怎么实现,到底是深拷贝还是浅拷贝,取决于内部的代码的实现。

 

5、iOS内存管理方式采用引用计数机制,通过或控制引用计数来实现操作对象的功能,一个对象的生命周期有生成、持有、释放、销毁,引用计数分为 ARCMRC,在MRC中,增加引用计数的方法有allocnewretaincopy,减少引用计数的方法为releaseautorelease,当引用计数增减平衡时,系统会自动执行对象的dealloc方法,销毁对象,完成该对象的内存管理。

 

你可能感兴趣的:(OC第七节 内存管理)