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内存管理方式采用引用计数机制,通过或控制引用计数来实现操作对象的功能,一个对象的生命周期有生成、持有、释放、销毁,引用计数分为 ARC、MRC,在MRC中,增加引用计数的方法有alloc、new、retain、copy,减少引用计数的方法为release、autorelease,当引用计数增减平衡时,系统会自动执行对象的dealloc方法,销毁对象,完成该对象的内存管理。