黑马程序员(OC内存管理)

来源:互联网 发布:java getservername 编辑:程序博客网 时间:2024/05/20 09:47

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

  今天我们来看看OC语法中另外一个重要的知识点:OC内存管理

  OC内存管理的范围:任何继承了NSObject的对象,对基本数据类型无效

  它的原理:

1、每个对象内部都保存了一个与之相关联的整数,称为引用计数器。

2、当使用alloc、new、或者copy创建一个对象时,对象的引用计数器被设置为1

3、给对象发送一条retain消息,可以使引用计数器值+1

4、给对象发送一条release消息,可以使引用计数器值-1;

5、当一个对象的引用计数器值为0时,那么它将被销毁,其占用的内存被系统回收,系统也会自动向对象发送一条dealloc消息。一般会重写dealloc方法,在这里释放相关资源。一定不要直接调用dealloc方法

6、可以给对象发送retainCount消息获得当前的引用计数器值。

  内存管理原则:

1、谁创建、谁释放,如果你通过alloc、new或copy来创建一个对象,那么你必须调用release或autorelease.换句话,不是你创建的,就不用你去释放。

2、一般来说,除了alloc、new或copy之外的方法创建的对象都被声了autorelease

3、谁retain,谁release。只要你调用了retain,无论这个对象如何生成的,你都要调用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,和之前拷贝的数据完全脱离关系

 

OC的内存管理,归根结底要记住一条黄金法则:谁创建谁释放,谁retain谁释放。

 

 

  

 

  

0 0