OC内存管理-黄金法则

一、内存管理-黄金法则app

The basic rule to apply is everything that increases the reference counter with alloc, [mutable]copy[withZone:] or retain is in charge of the corresponding [auto]release.函数

若是对一个对象使用了alloc、[mutable]copy、retain,那么你必须使用相应的release或者autorelease。spa

类型定义:对象

  基本类型:任何C的类型,如:int、short、char、long、struct、enum、union等属于基本类型或者结构体;blog

  内存管理对于C语言基本类型无效;继承

  任何继承与NSObject类的对象都属于OC类型。内存

  全部OC对象都有一个计数器,保留着当前被引用的数量。编译器

内存管理对象:it

  OC的对象:凡是继承于NSObject;内存管理

  每个对象都有一个retainCount计数器。表示当前的被应用的计数。若是计数为0,那么就真正的释放这个对象。

alloc、retain、release函数:

  1)alloc 函数是建立对象使用,建立完成后计数器为1;只用1次。

  2)retain是对一个对象的计数器+1;能够调用屡次。

  3)release是对一个对象计数器-1;减到0对象就会从内存中释放。

 增长对象计数器的三种方式:

  1)当明确使用alloc方法来分配对象;

  2)当明确使用copy[WithZone:]或者mutableCopy[WithZone:]copy对象的时;

  3)当明确使用retain消息。

上述三种方法使得计数器增长,那么就须要使用[auto]release来明确释放对象,也就是递减计数器。

………………

附加代码

………………

 二、retain点语法

OC内存管理正常状况要使用大量的retain和release操做;

点语言能够减小使用retain和release的操做。

编译器对于retain展开形式:

  @property (retain)Dog *dog;

  展开为:-(void) setDog:(Dog *)aDog;

      -(Dog *)dog;

  @synthesize dog = _dog;  //(retain属性)

  展开为:-(void) setDog:(Dog *)aDog{

        if(_dog != aDog){

          [_dog release];

          _dog = [aDog retain];

        }

      };

      -(Dog *)dog{

        return _dog;

      };

copy属性:copy属性是彻底把对象从新拷贝一份,计数器从新设置为1,和以前拷贝的数据彻底脱离关系。

相关文章
相关标签/搜索