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

    ==========================

    内存管理

    ==========================

    【问】内存管理到底做了件什么事?

    oc中内存是如何创建和如何释放。

    oc内存管理

    【手动内存管理MRC】

    Xcode5之前都是手动内存管理

    【问】现在都是Xcode7,为什么还要学习手动管理内存?

    【答】目前阶段,手动管理内存的项目仍然存在

    arc转mrc:工程—>targets—>build Settings—>搜索:gar;把yes—>no

    【c语言中内存管理的麻烦】

    1.创建的内存之后没有释放,这种情况称为【内存泄露】

    2.多次释放了同一块内存,这种情况称为【重复释放】【多次释放】

    3.在线程中对内存管理非常不方便,存在多次引用释放导致程序崩溃。

    4.c语言模块化编程,出现野指针。

    【oc中内存管理方式】引用计数器

    1.引用计数器可以理解为指针计数器,对一个对象引用了1次,堆空间计数器+1,释放了一次引用计数器,计数器-1,当计数器为0,对象内存释放;

    【oc中内存管理】

    1.严谨对一个堆空间进行多次释放(release)。【重复释放】—【崩溃】

    2.严谨对一个堆空间创建内存后,不去释放。【内存泄露】—【内存只增不减】

    【总】oc中内存管理,谁创建,谁释放,哪个类创建,哪个类负责释放,哪个类alloc ,哪个类release;

    【总】【mrc】oc中像 alloc、retain、copy、mutablecopy(或者是以mutablecopy、copy开头的系统方法)、new,这些都需要release/autorelase;

    retain 引用计数器+1,还是当前内存对象;

    copy 复制出来一个新的内存空间(mutablestring),不可以修改

    mutablecopy 复制出来一个新的内存空间(mutablestring),可修改

    【注】

    栈:对操作系统来说,函数的参数或者方法中的局部变量都在栈空间。

    堆:对操作系统来说,由程序员负责分配创建或者释放内存,这些内存空间都在堆空间

    【相关方法】

    1.如果在构造函数中alloc内存,需要在析构函数(delloc)函数中对内存进行释放。

    2.如果发生了成员变量指针的转移,需要先retain;

    3.从数据结构中取值,如果想长保留,需要retain;

    【MRC中的自动内存管理】

    1.自动释放池可以理解为延迟释放(自动释放);

    2.autorelease方法是可自动释放池搭配使用的,缺少了自动释放池,autorelease也就没效果了;

    【自动释放用处】

    1.一般用在局部方法中;

    2.用在非用不可的情况;

    3.mrc中,需要return的alloc对象,可以通过添加autorelease方法,交给系统去自动释放内存

    【属性变量修饰符】

    1.copy

    2.retain

    【补充】

    1.一般情况下,方法中的堆空间,释放的时候尽量在方法的底部写release;避免出现提前释放的问题。

    2.mrc工程从严格意义上说,性能优于arc工程;但是从使用层面上说,arc性能优于mrc;从编码程度上来说,arc比mrc的工作量更小;从安全角度上说,arc优于mrc;【手机性能过剩】

    【如何检测内存泄露】product—>Analyze;这个就会分析出工程中存在问题的代码

    【自动内存管理ARC】

    Xcode5之后都是自动管理内存

    【mrc转arc】Edit—>convert—>To Object-C ARC …

    【注】此操作不可逆

    【arc工程中使用Mrc】工程—>Targets—>Build Phases,选中先关的类.m文件,双击输入-fno-objc-arc;这样就把相关.m文件设为了mrc管理的文件

    【自动管理内存的弊端】

    1.自动管理内存某一些代码仍需要手动管理,并不是说要手动release,arc中属性变量对用retain、strong、weak没有一个严格的要求;但是在arc和非arc混编会有要求。

  • 相关阅读:
    深度学习[numpy实现]:深度学习模型的通用步骤
    手写数字识别[paddle框架]:1.数据处理
    Lesson3-基于神经网络方法求解RL
    Lesson2 基于表格法求解RL
    nginx和uwgsi设置
    CentOS 7.6.8 最小化安装后,安装Mysql5.7
    CentOS 7.6.8 最小化安装后,安装Python3.7.2
    excel查找一行中一个单元格的值,返回前一个单元格值的公式
    test_title
    os.system()、os.popen()和subprocess的区别(一)
  • 原文地址:https://www.cnblogs.com/GJ-ios/p/5304585.html
Copyright © 2011-2022 走看看