黑马程序员技术交流社区

标题: OC加强(一) [打印本页]

作者: zcj417311802    时间: 2016-1-14 15:49
标题: OC加强(一)
-------------------------------"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