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

     

  • 相关阅读:
    老王学jsp之javabean与表单
    老王学jsp之http500错误
    老王学jsp之session
    转 Fiddler抓取HTTPS
    PHP 大型网站优化 大数据大并发大流量
    大流量、高并发的网站的底层系统架构
    大流量、高并发Web系统搭建(单机到分布式集群)
    Failed to start Load Kernel Modules
    ubuntu 16.04 我的任务栏呢 怎么只剩下桌面了
    跳坑日志之腾讯服务器不见了
  • 原文地址:https://www.cnblogs.com/hyl2012/p/5213142.html
Copyright © 2020-2023  润新知