zoukankan      html  css  js  c++  java
  • SET方法内存管理

    SET方法内存管理

    情况一:Person类中有一个属性car

    -(void) setCar:(Car *) car{

      _car = car;   // line 1

    }

    这样做是不妥的,主方法中调用一下说明这个不妥:

    Person * p = [[Person alloc]init];

    Car * c = [[Car alloc]init];  

    p.car = c;  // 调用上面set方法中的line 1 ,因无alloc copy new ,故 虽然 _car 使用并指向了 Car对象,但对Car对象的retainCount并无影响!

    [c release]; // Car对象retainCount 为 0 ,Car 对象消失

    ------此处,Person类对象还没消失,但其内的_car属性已无意义,因其所指的对象已经消失--------

    [p release]

    情况二:为改进情况一,修改set方法如下

    -(void) setCar:(Car *) car{

      _car = [car retain];   // line 2

    }

    -(void)dealloc{

       [_car release];  // 覆写dealloc方法,既然_car retain了一下Car对象,那么Person对象覆灭时候,作为其内属性的_car也应该release掉这次引用,这也是符合黄金法则的。

       [super dealloc];

    }

    其意思是,既然_car要使用Car对象,就应该对Car对象做一次引用保留,增加一次retainCount,说明_car在这个属性在使用着Car对象。

    但这样仍然是不完善的,主文件中调用一下说明这个不完善:

    Person * p = [[Person alloc]init];

    Car * c1 = [[Car alloc]init];  

    p.car = c1;  // c1的Car对象 引用计数为 2

    Car * c2 = [[Car alloc]init];  

    p.car = c2;  // c2的Car对象 引用计数为 2。同时,_car 不再指向 c1的Car对象!

    [c2 release]; // c2 retainCount 1

    [c1 release]; // c1 retainCount 1

    [p release];  // p覆灭,同时c2 retainCount 0; c1 retainCount 1,造成内存泄露

    情况三:继续改进情况二

    -(void) setCar:(Car *) car{

        if(_car != car){

        [_car release];   // 如果_car有旧值,那么这一步会使其释放所保留其指向对象的引用;如果没有旧值,等效于 [nil release] 也无不可

        _car = [car retain];   

        }

    }

  • 相关阅读:
    功能检查和降级
    蓄水池问题
    Linux删除大于/小于固定大小的文件等
    理解Faster-RCNN 中的Anchor
    【转】DBSCAN密度聚类算法
    ROC曲线和PR曲线
    LSTM比较RNN
    【转】ROI Pooling
    【转】VGG网络结构及参数
    面试知识点准备(各方面)
  • 原文地址:https://www.cnblogs.com/chenqingxiao/p/4405040.html
Copyright © 2011-2022 走看看