11.7 星期四 主要学习笔记

(注:本文极为不严谨)

本文将介绍关于ios中的内存管理知识:

                许多时候在不支持ARC的情况下需要我们自己管理内存:其实再没有ARC之前  内存一直需要我们自己管理  

在早期的ios中苹果公司只给我们很少一部分内存来运行程序;一旦超过这个数值就会出现"crash"也就是常说的闪退;

于是合理管理内存成为每个ios程序员的必修课,下面将作为入门课程为你讲解如何管理内存;

               首先作为一门面向对象语言,实例化oc下的类时,我们需要在堆中为它分配一部分内存来存储;通常我们用alloc

例如:Person * p=[ [Person alloc] init ];这里我们做了三步操作:

  1. 在堆中开辟一片空间:实际操作是:将Person类的实例变量(注意:方法没有拷贝)拷贝了一份放在堆中;
  2. 初始化刚才的各种实例变量
  3. 把这片空间的地址存放到指针变量p中;

ok 现在我们来看第一种释放内存的方法:[p  release];执行完这行代码的时候刚才申请的那片空间就释放掉了

             看起来很简单对吧  那么让我们看看内部是怎么运作的呢,我们都知道在分配在堆上的这些对象的内部都会有一个计数器,这就是oc中有名的Retain Count(引用计数) 当我们执行alloc的时候其变为1,retain的时候执行加一;

 

........

下面我们看一下系统的内部处理以便更深刻的理解:

首先当我们的RC变为0的时候release将会自动执行dealloc方法

具体实现

(..)  release

           {

              if(RC>1)

               {

                    R C--;

                  }

            else{[ self  dealloc]

                    }

          }

然后是属性的实现

assign  直接赋值 适用于基本数据类型;(不带*号的)

{
_name=name;˚
}


retain 
赋值时做内存的you'hua优化 (适用于du对象类型)(*)
{
if(_name!=name)
{
[_name release];
_name=[name retain];

}
}

copy
复制一个副本(特殊的...内部有n'sstrcoping)

{
if(_name@!=name)
{
[_name release];
_name=[name copy];

}

}

 

 

也就是说在属性@property (nonatomic,retain)Person* per;

相当于对set方法中的传进来的值进行一次retain操作于是乎在dealloc中要进行一次release操作

即重写dealloc方法;

-(void)dealloc

{

对象属性   release;

[super   dealloc];   (这里调用super的dealloc方法是因为上面已经吧自己的对象属性给处理掉了 然后再去调用父类的dealloc去处理继承过来的对象方法)

 }

 

ok现在  第三种;

便利构造器:

-(id)initWithSpeed:(int)speed

{

    if (self=[super init]) {

        [self setSpeed:speed] ;

    }

    returnself;

}

 

+(id)carWithSpeed:(int)speed

{

    Car * car = [[Car alloc]initWithSpeed:speed];

    

    [car autorelease];

    

    return car;

    

}

 这里我们只能用autorelease去释放他

 

 

ok.....

 

 

 

 

 

posted @ 2013-11-07 21:27  jian啊jian  阅读(117)  评论(0编辑  收藏  举报