zoukankan      html  css  js  c++  java
  • oc对象的内存管理

    oc没有java的垃圾回收机制,所以对象的内存释放很重要,基本数据类型,我们不用理会,编译器会处理;

    oc的每个对象内部都由一个计数器,用来记录当前有几个指针在指向该对象;当计数器为0时该对象会从内存中释放;

    相关方法和概念:

    1:retain:对象方法,调用该对象方法,计数器+1,有返回值,返回对象本身;

    2:release:没有返回值,计数器-1;

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

    4:dealloc:当对象被回收时,就会调用该方法,覆盖该方法时一定要调用[super dealloc],且放在最后;释放的顺序一般是先释放子类再释放父类;

    注:arc环境下不用调用[super dealloc]

    概念:

    1:僵尸对象:内存已经被回收的对象,僵尸对象是不能在使用的,

    2:野指针:指向了僵尸对象(不可用内存)的指针;给野指针发消息会报错:EXE_BAD_ACCESS

    3:空指针:没有指向任何对象的指针:值为0、nil、null;给空指针发消息不会报错;

     

    多对象内存管理:

    内存管理核心思想:一般来说,类方法:alloc是在堆中开辟空间的,调用了alloc,计数器会+1;所以一旦写了alloc,一定要写release;同样调用了retain,一定要调用release;

    当对象较多时,对象之间的组合关系很容易让我们忽视掉了,这个对象的指向者有几个;所以规范严格的写好setter方法和dealloc方法;

    内存管理代码规范总结:

    1:只要调用了alloc,必须有release(autorelease)

    2:setter的规范写法:

        *:如果是基本数据类型,则和平常一样;

      *:如果成员变量是对象,也就是组合关系时,比如Person拥有一辆Car;那么Car的setter:

      

    - (void)setCar:(Car *)car
    {
          // 首先判断传入的car是否和存在的car是同一个
          if(_car != car)
          {
                // 先释放以前的car
                [_car release];
                // 在赋值 ,一定先对新的car做一次retain
                _car = [car retain];  
          }
    }

      3:dealloc方法的代码规范:

              *:对self (当前) 拥有的其他对象执行一次release

              *:一定要调用父类的dealloc [super dealloc],且要放到最后边;

    - (void)dealloc
    {
         // 对当前对象的其他对象release
         [_car release];
         [super dealloc];
    }

     

  • 相关阅读:
    FastDFS源代码分析之tracker协议分析
    uva 11396Claw Decomposotion(二分图判定)
    Ising模型(伊辛模型)
    开发RESTful WebService
    HDU 4951 Multiplication table 阅读题
    【Quick-COCOS2D-X 3.3 怎样绑定自己定义类至Lua之三】动手绑定自己定义类至Lua
    as3文本框的动态拖拽和编辑
    cocos2d-x3.0rc 版 设置模拟器窗体大小
    chromium for android v34 2dcanvas硬件渲染实现分析
    唐季礼_百度百科
  • 原文地址:https://www.cnblogs.com/cxbblog/p/3721715.html
Copyright © 2011-2022 走看看