-------------------------------"OC加强概念"---------------------------- 1.OC的内存管理 "!!!非常重要 非常重要 非常重要!!!" OC内存管理的内容是堆区中创建的所有OC对象 OC中的内存管理分为:手动内存管理--MRC 自动内存管理--ARC 垃圾回收--GC iOS中无此种机制 手动内存管理:创建一个对象时,引用计数器(retainCount)为1,当引用计数器为0时,对象被释放,内存被系统回收.手动管理内存需要遵循的原则:"谁创建,谁release"(释放),"谁retain,谁释放","只要retainCount不为0,则对象会一直存在" 自动内存管理:机制是当一个对象没有被强指针指向时,该内存就会被立即释放,同时指向该对象的弱指针自动赋值为nil //可能说到这里就会问另一个人什么是强指针什么是弱指针了 2.强指针与弱指针 强指针:所有OC对象的指针默认都是强指针,关键字为__strong. 弱指针:用__weak修饰的指针,当所指向的对象被释放时,自动被赋值为nil 3.野指针与僵尸对象 "重要重要重要,重要事情说三遍" OC中的野指针就是指向僵尸对象的指针或者未赋值的指针(类似于C中的野指针) 僵尸对象:当一个对象的引用计数变为0(MRC)或者没有被强指针指向时,其所占用的内存就会被系统回收.但是系统在没有新对象使用该空间前不会初始化该内存区域,原对象的数据信息仍会保留,通过原有的指针,可能仍可以访问到被释放对象的信息,这时候就称这个对象为"僵尸对象".对于僵尸对象,编译器并不会报错,需要在Xcode界面中设置开启僵尸对象检测 4.内存泄露 "比上面的稍微不重要一点点" 当一个对象所有相关的局部变量都被释放,而引用计数不为0(MRC)或者仍然被强指针指向(ARC)时,此时该对象已经无法被访问,但所占用的内存不会得到释放.这时就称发生了内存泄露 MRC下造成内存泄露的原因:1.使用后未release 2.retain次数多于release 3.不恰当的使用nil(在原对象引用计数不为0时) 5.多个对象的内存管理泄露问题解决方案("循环引用") MRC:相互具有关联关系的两个类的对象,一端用retain,一端用assign ARC: 一端用strong,一端用weak |
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) | 黑马程序员IT技术论坛 X3.2 |