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];   

        }

    }

  • 相关阅读:
    POJ 3126 Prime Path
    POJ 2429 GCD & LCM Inverse
    POJ 2395 Out of Hay
    【Codeforces 105D】 Bag of mice
    【POJ 3071】 Football
    【POJ 2096】 Collecting Bugs
    【CQOI 2009】 余数之和
    【Codeforces 258E】 Devu and Flowers
    【SDOI 2010】 古代猪文
    【BZOJ 2982】 combination
  • 原文地址:https://www.cnblogs.com/chenqingxiao/p/4405040.html
Copyright © 2011-2022 走看看