• 引用计数器 与 内存管理


    一、引用计数器的基本操作:

      1.方法的基本使用
        1> retain :计数器+1,会返回对象本身
        2> release :计数器-1,没有返回值
        3> retainCount :获取当前的计数器的值
        4> dealloc
          // 当一个Person对象被回收的时候,就会自动调用这个方法
          - (void)dealloc
          {
            NSLog(@"Person对象被回收");
            // super的dealloc一定要调用,而且放在最后面
            [super dealloc];
          }
      2.概念
        1> 僵尸对象 :所占用内存已经被回收的对象,僵尸对象不能再使用
        2> 野指针 :指向僵尸对象(不可用内存)的指针,给野指针发送消息会报错(EXC_BAD_ACCESS)
        3> 空指针 :没有指向任何东西的指针(存储的东西是nil、NULL、0),给空指针发送消息不会报错

    二、多个对象之间的内存管理:

      1.你想使用(占用)某个对象,就应该让对象的计数器+1(让对象做一次retain操作)
      2.你不想再使用(占用)某个对象,就应该让对象的计数器-1(让对象做一次release)
      3.谁retain,谁release
      4.谁alloc,谁release

    三、set方法的内存管理:

      内存管理代码规范:
        1.只要调用了alloc,必须有release(autorelease)
           对象不是通过alloc产生的,就不需要release

        2.set方法的代码规范
          1> 基本数据类型:直接复制
          - (void)setAge:(int)age
          {
            _age = age;
          }

          2> OC对象类型
          - (void)setCar:(Car *)car
          {
            // 1.先判断是不是新传进来对象 (注意换车时要对旧车进行release操作,否则会有内存泄露的危险!)
            if ( car != _car )
            {
              // 2.对旧对象做一次release
              [_car release];
              
              // 3.对新对象做一次retain
              _car = [car retain];
            }
          }

        3.dealloc方法的代码规范:(不要直接调用dealloc) (此方法是系统自动调用的。)
          1> 一定要[super dealloc],而且放到最后面
          2> 对self(当前)所拥有的其他对象做一次release
          - (void)dealloc
          {
            [_car release];
            [super dealloc];
          }

    四、@property参数:

      》1.控制set方法的内存管理:
        retain:release旧值,retain新值(用于OC对象)
        assign:直接赋值,不做任何内存管理(默认,用于非OC对象类型)
        copy:release旧值,copy新值(一般用于NSString *)
      》2.控制需不需生成set方法:
        readwrite:同时生成set方法和get方法(默认)
        readonly:只会生成get方法
      》3.多线程管理:
        atomic:性能低(默认) (加锁)
        nonatomic:性能高 (不加锁)
      》4.控制set方法和get方法的名称:
        setter:设置set方法的名称,一定有个冒号:
        getter:设置get方法的名称


    五、autorelease:

      1.系统自带的方法中,如果不包含alloc、new、copy,那么这些方法返回的对象都是已经autorelease过的
        [NSString stringWithFormat:....];
        [NSDate date];

      2.开发中经常写一些类方法快速创建一个autorelease的对象
        * 创建对象的时候不要直接使用类名,用self

  • 相关阅读:
    虚拟化技术一些概念整理
    更改KVM虚拟机root的密码
    文件作为块设备访问
    KVM虚拟机IO处理过程(二) ----QEMU/KVM I/O 处理过程
    KVM虚拟机IO处理过程(一) ----Guest VM I/O 处理过程
    KVM的初始化过程
    linux删除文件未释放空间问题处理
    cgroup测试存储设备IOPS分配
    数组中的逆序对
    VMware Tools安装方法及解决无法全屏显示问题
  • 原文地址:https://www.cnblogs.com/tzktzk1/p/3329619.html
Copyright © 2020-2023  润新知