zoukankan      html  css  js  c++  java
  • iOS 基础 第四天(0809)

    0809 - 内存管理,只对oc对象生效. alloc、retain、release、retainCount

    局部变量是放在栈里面的,oc对象是放在堆里面的。栈里面的内容系统自动回收,而堆里面的内容还在,所以不适用ARC的时候要手动回收这些对象内容

    如下图所示:


    对象的基本结构
    • 每一个对象内部都有一个引用计数器,占用4个字节,是一个整数,当这个引用计数器的值为0的时候,这个对象就会被系统回收销毁.当一个对象刚刚诞生的时候,这个计数器的值为1

    如下图所示:


    引用计数器的作用

    如下图所示:


    引用计数器的操作

    如下图所示:


    对象的销毁

    如下图所示:

    野指针
    • 野指针:指向僵尸对象(不可用内存,这个内存已释放)的指针.例如:[p release]执行多次释放.可能会出错,前提是要打开Scheme下面的僵尸对象探测开关.

    开关如下图:

    也指针现象如下图所示:

    具体错误现象如下图:

    为了防止野指针可以将指针指向nil p = nil;


    一些内存的总结

    如下图:


    有alloc就有release,有retain就有release

    如果同时手动实现了一个成员变量的方法的话,这个成员变量的真实名称就不是name了。如果还是要使用name的话就要在@interface{}里面手动写上_name

    如下图所示:

    或者


    自动释放池 autoreleasepool 自动释放 autorelease
    • 自动释放池里的方法执行完毕后会自动调用一次释放池里对象的release方法
    • 自动释放池可以嵌套自动释放池
    • 自动释放池是放在栈中的
    • 自动释放池里的对象无法精确控制.只有自动释放池方法执行完成的时候才会调用所有对象的release方法,将对象的引用计数器-1,及时都-1了这个对象也不一定就能释放,这里需要看自己的内存控制方式.

    自动释放池栈结构:

    自动释放池代码结构:


  • 相关阅读:
    iOS开发之--将 "中文" 转化成 "拼音"
    iOS swift语言
    手势识别
    学习git
    iOS开发如何在外面拿到一个子控件的frame ????
    协议和代理的理解及使用
    iOS开发之----生成二维码
    组合数C(n,m)的四种求解方法
    求一个数的正数因子(模板)
    图论五:网络流
  • 原文地址:https://www.cnblogs.com/lyandy/p/5116822.html
Copyright © 2011-2022 走看看