-------------------------------"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 |
|
|