内存管理

来源:互联网 发布:php证书查询系统 编辑:程序博客网 时间:2024/06/01 18:53
  • 内存管理
    • 在内存中申请空间,存储数据. 声明1个变量.
    • 当数据不再使用的时候,内存中申请的空间就应该被释放.

  • 内存中的五大区域.

    • 栈: 存储的是局部变量.局部变量所在的作用域被执行完毕之后.就会被系统立即回收.
    • 堆: 程序员手动申请(malloc calloc realloc)的空间。除非程序员手动释放(free)否则直到程序结束的时候才会被释放.

      • OC对象,new或者alloc的时候OC对象就被创建在堆空间.
      • OC对象需要被回收吗? 什么时候被回收呢?如何回收呢?
    • BSS段: 存储未初始化的静态变量、全局变量. 一旦被初始化就从BSS段回收,存储到数据段.

    • 数据段: 已经被初始化的静态变量、全局变量.常量数据. 程序结束的时候才会被回收.
    • 代码段: 存储代码.直到程序结束的时候才会被回收.

  • 堆中的OC对象是肯定需要被回收的.

    iPhone 512 1GB 2GB

    40M 警告.
    45M 警告.
    120M 闪退.

  • 内存管理的范围.

    • 存储在堆中的OC对象不会自动回收.
    • 如果我们创建1个OC对象,这个OC对象的被分配在堆区.
    • 它不会被自动回收. 如果我们不管它的话 它会在程序结束的时候才会被回收掉.

    • 我们需要管理的是: 堆区中的OC对象的释放.


  • 堆区的OC对象的回收.

    • 什么时候应该回收OC对象.
      当OC对象不再使用的时候,或者说没有人使用这个对象的时候 这个对象就应该被回收掉.

    • 对象的拥有者

      • 谁在使用这个对象,谁就是这个对象的拥有者.
      • 1个指针指向1个对象 我们就说这个指针是这个对象的拥有者. 这个指针在使用这个对象.
    • 当没有任何指针指向这个对象的时候,就代表这个对象没有任何人在使用它 那么这个时候就应该销毁这个对象.


  • 引用计数器

    • 每1个OC对象,都有1个属性 叫做retainCount 类型是unsinged long 占据8个字节. 叫做引用计数器.
    • 这个属性的作用:用来记录有多少个人正在使用这个对象.

    有1个OC对象.

    • 当有1个人使用这个对象的时候,就应该为这个对象的引用计数器+1 代表这个对象多了1个人使用.
    • 当少1个人使用这个对象的时候,就应该为这个对象的引用计数器-1 代表少1个人使用这个对象.

    • 当对象的引用计数器为0的时候. 代表没有人再使用这个对象了,那么这个时候系统就会自动回收这个对象.

    • 在对象被回收的时候,会自动调用这个对象的dealloc方法.
  • 操作对象的引用计数器

    • . 为对象发送1条retain消息. 这个对象的引用计数器就会+1

    • . 为对象发送1条release消息.这个对象的引用计数器就会-1

    • . 为对象发送1条retainCount消息.就会得到这个对象的引用计数器的值.

    • 当对象的引用计数器的值为0的时候.系统就会立即回收这个对象 并执行这个对象的dealloc方法.


  • 内存管理的分类.

    • OC对象的内存管理分为两类.

    • MRC: Mannul Reference Counting 手动引用计数.

      • 程序员手动写代码来改变对象的引用计数器的值.
      • 每当多1个人使用对象的时候 手动的为对象发送1条retain消息.
      • 当少1个人使用这个对象的时候 手动的为对象发送1条release消息
    • ARC: Automatic Reference Counting 自动引用计数.

    • Xcode编译器自动的改变对象的引用计数器的值.
      • 当多1个人使用对象的时候,就自动的为对象发送1条retain消息.
      • 少 release.
0 0