zoukankan      html  css  js  c++  java
  • IOS基础之 (十) 内存管理

    一 基本原理

    1.什么是内存管理

      移动设备的内存有限,每个app所能占用的内存是有限制的。

      当app所占用的内存较多时,系统会发出内存警告,这时得回收一些不需要再使用的内存空间。比如回收一些不需要使用的对象,变量。

      管理范围:任何继承了NSObject,对其他基本数据类型(int, char, float, double,struct,enum等)无效。

    2.对象的基本结构

     

      每个OC对象都有自己的引用计数器,是一个整数,表示"对象被引用的次数",即有多少个类正在使用这个OC对象。

      每个OC对象内部专门有4个字节的存储空间来存储引用计数器。

         局部变量放在里,动态变量(对象)放在里。代码块执行完毕,栈里面的局部变量被销毁,但是堆里的东西是动态分布,不会被销毁,必须手动销毁,如果没有销毁会造成内存泄漏。(Java里没有指针变量,那么对象就会被自动回收)

    3.引用计数器的作用

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

         当一个对象的引用计数器值为0时,对象占用的内存就会被系统回收。换句话说,如果对象计数器不为0,那么在真个程序运行过程,它占用的内存就不能被回收,除非整个程序已经退出。

    4.引用计数器的操作

      给对象发送一条retain消息,可以使引用计数器+1(retain方法返回对象本身)。

      给对象发送一条retain消息,可以使引用计数器值-1。

      可以给对象发送 retainCount消息获得当前的引用计数器值。

    5.对象的销毁

        当一个对象的引用计数器值为0时,那么它将被销毁,其占用的内存被系统回收。

      当一个对象被销毁时,系统会自动向对象发送一条dealloc 消息。

      一般会重写dealloc方法,在这里释放相关资源。dealloc就像对象的遗言。

          一般重写了dealloc 方法,就必须调用 [super dealloc] ,并且放在最后面调用。

      不要直接调用dealloc方法。

    总结:

        1)retain 计数器加1,返回对象本身。

        2)release:计数器减1,没有返回值。

        3)retainCount:获取当前计数器的值。

        4)dealloc: 当对象被回收时,就会调用。

                         一定要调用[super dealloc] ,这个调用放到最后。

        5)僵尸对象:所占内存已经被回收,僵尸对象不能被使用。

        6)野指针:指向僵尸对象(内存不可用)的指针,给野指针发送消息会出错。

        7)空指针:没有指向任何东西的指针(存储的东西是 nil ), 向空指针发送消息不会报错

       

    二多对象的内存管理

    总结:

    1.当向占有某个对象时,应该让对象的引用计数器+1(让对象做一次retain操作)

    2.当不占有某个对象时,让对象的引用计数器-1 (让对象做一次release操作)

    3.谁retain,谁release

    4.谁alloc,谁retain

    5.当引用计数器为0,就会调用对象的 dealloc.

    6. [super dealloc] 写在最后。

    内存管理代码规范:

    1.只要调用了alloc,就必须要有release( autorelease). 对象不是通过alloc产生的,就不要release.

    2.set代码规范

    1>基本数据类型: 直接赋值。

    - (void) setAge: (int) age{
       _age = age;
    }

    2)OC 对象类型:

    - (void) setCar:(Car *) car{
       //1.  先判断是不是新传进来对象
      if( car != _car){
           //2.对旧对象做一次release
          [_car release];
    
           //3.对新对象做一次retain
          _car = [car retain];
      }
    
    }

    3.dealloc代码规范:

    1)一定要调用[super dealloc] ;

    2)并且一定要对当前对象所拥有的对象,一定要做一次release.

    - (void) dealloc{
        [_car release];
        [super dealloc];
    }

    参考知识:

    http://www.cnblogs.com/lianghui66/archive/2012/11/13/2768281.html

    http://www.cnblogs.com/iflewless/p/3912604.html

    http://www.cnblogs.com/langtianya/p/3722129.html

    http://blog.sina.com.cn/s/blog_945590aa0102vnun.html

    http://www.cnblogs.com/GISerYang/p/3346092.html

    http://www.cnblogs.com/wendingding/p/3704739.html

  • 相关阅读:
    Apache Cassandra 4.0新特性介绍
    NoSQLBench压测工具入门教程
    赵洋:深入了解Materialized View
    PHP与ECMAScript_1_变量与常量
    HTTP_5_通信数据转发程序:代理、网关、隧道
    HTTP_4_返回结果的HTTP状态码
    HTTP_3_HTTP报文
    HTTP_2_HTTP协议概要
    HTTP_1_Web及网络基础
    一个完整的产品设计流程——家庭安全管家
  • 原文地址:https://www.cnblogs.com/wangshuo1/p/ios-10.html
Copyright © 2011-2022 走看看