zoukankan      html  css  js  c++  java
  • OC9-内存管理

    1.iOS里面有一个经常出现的现象,就是崩溃,也就是闪退,90%以上都是内存原因,

         1)内存溢出 2)野指针异常 内存大比较难以发现问题,需要程序员对内存管理有比较好的使用习惯。

    2.内存溢出:超出分配内存访问,5s内存50M;6内存限制80M;6s内存限制130M;

    3.野指针异常:野外的指针,没有主的,

    4.内存问题的解决问题,内存管理:

          1)垃圾回收:garbage collection

          2)MRC Manule reference count 手动引用计数

          3) ARC auto reference count 自动引用计数

    5.iOS 没有垃圾回收机制,

             (1)安卓(java)用的是垃圾回收  垃圾回收的算法机制有哪些:

             (2)引用计数/引用计数的升级/标记删除/标记整理/分代回收    年青代,年老代,持久代, 

        (3)程序员可以不用考虑对象的内存回收,只需要关心对象之间的关系就行,至于对象的回收,JVM会自动处理,不需要写任何代码

    6.MRC,内存的开辟和释放都是程序员释放的,相对于垃圾回收,对内存的控制更灵活,可以在需要的时候进行释放,但是对程序员的要求较高,需要熟悉内存管理机制。

    7.ARC 

              是iOS 5.0引入的新特性,只允许用户开辟空间,不允许释放和修改内存,arc不是垃圾回收,本质上还是MRC,是其的升级版是编译器代替程序员进行内存的释放。

      (1)ios 支持MRC和ARC(2)ARC不是垃圾回收,(3)MRC 的机制是引用计数

    8.MRC  

           (1)  OC当中采用引用计数,当一个指针指向一个内存的时候,这块内存的引用计数就加1,当一个指针被去掉的时候,引用计数就减1,

           (2)当引用计数为0的时候,就回收这块内存(除nil)// 当引用计数为1,还要进行release的时候,就回收这块内存,回收之后,内存之后不变,引用计数依旧为1。//

       (3)回收,收回这块内存的使用权限,对内存没有进行任何操作。

       (4)MRC实质就是通过一系列函数实现对内存引用计数的管理,

                 这些函数是:+alloc,     -retain,   -copy,     -release,       -autorelease

     9. +alloc  类方法,向系统申请一块内存,,让其引用计数从0到1 ;这是唯一一个有0到1的过程,

        retainCount 功能是求指针指向的那块内存的引用计数,(nsstring等系统的函数,不要去使用该函数来求取引用计数,当只有一个字母存在栈区,返回的是retaincount 的长整型的最大值,当有多个字母时放在堆区可以计数);

         assign的基本数据类型在栈区,其内存释放有系统自动回收,不需要引用计数,

     10. -retain 对一块内存的引用计数加1,在MRC下,单纯的多一个指针去指向一块内存,这块内并不存在直接增加他的引用计数,只有上面的几个方法引用计数。

     11. -copy 讲目标内存的所有数据拷贝一遍,重新申请一样大小的内存,把数据存进去,新的内存的引用计数置为1,

        (1)要想实现copy 必须实现nscopying协议。

              - (id)copyWithZone:(NSZone *)zone 根据空间拷贝。

     12.release 将目标的内存块的引用计数减1,

            //#define SafeFree(p)  [p release]; p=nil;// 批量处理释放对象空间。

     13 autorelease是一种自动释放的方式,@autoreleasepllo {} 

         // 自动释放池,会对所有的存在的释放池中的对象进行释放,前提是这个对象被添加了标记。

       特点(1)释放的时机,在大括号结束的时候,对所有加标记的对象释放,  

            (2)自动释放池对于标记对象的存储是用栈结构存储。当自动释放池执行到右括号时,会去栈中挨个取对象,release每个对象。

    14 dealloc 会在一个对象呗释放的时候,自动 调用nsobject的dealloc 方法 

          (1)故不要调用dealloc!!!

         (2)当内存快被回收的时候,才会被自动调用。

  • 相关阅读:
    [Leetcode]7. 整数反转
    [Leetcode]6. Z 字形变换
    [Leetcode]5. 最长回文子串
    java实现各种排序算法1
    [Leetcode]4. 寻找两个正序数组的中位数
    css设置字体单行,多行超出省略号显示
    如何获得select被选中option的value和text和......
    在vue项目中,将juery设置为全局变量
    js中遍历对象的属性和值的方法
    深入理解JS的事件绑定、事件流模型
  • 原文地址:https://www.cnblogs.com/ytmaylover/p/5049205.html
Copyright © 2011-2022 走看看