• 【其他】Objective-C 内存管理学习总结


    转载请注明出处:http://www.cnblogs.com/shamoyuu/p/OC_CG.html

    最近学习了Objective-C语言(以下简称OC),其他的都还好,唯有它的内存管理让我不知所措。因为OC跟我熟悉的Java、C#、js语言不同。Java,C#和js都是自动的垃圾回收,资源都是托管给虚拟机或者引擎,让他们定期查找不再使用的对象然后销毁。而OC的内存管理跟C和C++一样完全手动,我们程序员需要负责一个对象从生到死的每个过程,想想都心累。如果不做内存管理,不释放对象资源,那对象就会一直在内存中,很容易就内存溢出,程序闪退。

     

    OC的内存管理对任何继承了NSObject的对象都适用,对其他的基本数据类型无效。

    在代码块运行完成后,栈空间的变量会自动回收,但是堆空间的对象是无法自动回收的,只能手动回收。在Java中,如果没有任何变量指向一个对象的时候,就会被标记回收了。

     

    OC里每个对象都有自己的引用计数器,它是一个整数,表示对象被引用的次数。如果计数器是0,则表示没有变量引用它,就会被回收。如果计数器不为0,那它就会一直在内存中,不会被回收。
    当一个对象被销毁的时候,系统会自动调用对象的dealloc方法,一般我们会重写dealloc方法,用来释放相关的资源。
    如果重写了dealloc方法,那一定要调用[super dealloc],并且放在最后,因为要先销毁子对象的资源,然后让父对象去销毁,这和创建对象的过程相反。
    如果一个对象引用计数器变成0,那这个对象就被释放了,它就叫做僵尸对象。
    如果一个指针指向一个僵尸对象,那么这个指针就叫野指针。
    访问一个僵尸对象就会报EXC_BAD_ACCESS,很常见的错误,有点类似Java里的空指针。
    应该在对象释放的时候,给指针赋值nil,nil就是空指针,而调用空指针的方法是不会报错的,跟Java里完全不一样。

     

    当使用alloc、new和copy创建一个新对象的时候,新对象的引用计数器默认是1。

     

    跟引用计数器相关的常用方法有这3个:

    • retain:引用计数器+1,并返回对象本身
    • release:引用计数器-1,没有返回值
    • retainCount:获得当前引用计数器的值

     

    因为多个指针可以指向同一个对象,这样会使计数器加减混乱,所以我们在写OC代码的时候有两个原则:

    1. 谁创建,谁release
    2. 谁retain,谁release

    总结一下就是“谁+1,谁-1”,只有这样,对象的引用计数器都可以正确地进行操作。

     

    在OC里面有一个autoreleasepool(自动释放池)对象,它可以接管autorelease(自动释放)的对象,在这个自动释放池销毁的时候,它里面所有的自动释放对象都会调用release方法。

    @autoreleasepool //创建了自动释放池对象
    {
        Animal *dog = [[[Animal alloc] init] autorelease];
    
        [dog eat];
    } //销毁了自动释放池对象

    这样做的好处是显而易见的,可以自动帮我们把创建的对象的引用计数器减1,如果只有一个指针指向它的话(大多数情况都是如此),就不必我们手动release来释放了。

     

    自从ios6有了ARC以后,内存管理就不用这么复杂了^_^

  • 相关阅读:
    npm install node-echarts npm ERR! code ELIFECYCLE
    MySql-Proxy之多路结果集归并
    Error: Cannot find module 'is-accessor-descriptor'
    如何在Node.js实现兼容ES6
    perl 自动识别编码,转换编码
    Mixin result declared without body
    Python爬虫入门教程 48-100 使用mitmdump抓取手机惠农APP-手机APP爬虫部分
    unexpected token "indent"
    Radware:上周五美国大规模DDoS攻击是如何发生的
    Radware:上周五美国大规模DDoS攻击是如何发生的
  • 原文地址:https://www.cnblogs.com/shamoyuu/p/OC_CG.html
Copyright © 2020-2023  润新知