引用计数器 与 内存管理

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

  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

原文地址:https://www.cnblogs.com/tzktzk1/p/3329619.html