OC-内存管理中部分.h文件和.m文件中的代码,注释很重要

.h文件

-----------------------------------------

#import <Foundation/Foundation.h>

#import "Car.h"

 

@interface Person : NSObject

{

    

    Car *_car;

    NSString *_name;

}

-(void)setName:(NSString *)name;

-(NSString *)name;

 

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

-(Car *)car;

 

-(void)drive;

 

@end

 

 

.m文件

-----------------------------------------

#import "Person.h"

 

@implementation Person

-(void)setName:(NSString *)name{

    if (_name!=name) {

        //release 旧值

        [_name release];

        //retain 新值

        _name=[name retain];

    }

}

-(NSString *)name{

    return _name;

}

 

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

    if (_car!=car) {//用这个是怕两次传入同一个c1,那样会照成野指针错误

        

        //c1=2->c1=1

        [_car release];//当第一次c1传进来的时候,因为之前没有任何车传入,所以_car=nil.[nil release]执行不报错,但是也无效 * //当c2传进来的时候,c1之前在main函数中已经release一次了,c1已经为1了,且当前_car就是c1,所以c2进来时候,c1(_car)release后,retainCount=0,自动调用dealloc销毁,[旧值 release]

        //c1 =2->c2=2

        _car=[car retain];//当第一次c1传进来的时候,c1=1+1=2了,* 当c2传进来的时候,c2由1变成2,退出,回到main函数

    }

}

-(Car *)car{

    

    return _car;

}

 

-(void)drive{

    

    [_car run];

    

}

 

//-(NSString  *)description{

//

//    return [NSString stringWithFormat:@"age is %d",_age];

//}

 

-(void)dealloc{

    //此时的已经是c2了,c2=0

    [_car release];//c2已经传进来,("此时的car"=_car),此时的_car再release一次,也销毁来

    [_name release];

    NSLog(@"Person 对象被销毁!"); //  打印4:Person 对象被销毁!

    

    [super dealloc];

}

 

@end

 

原文地址:https://www.cnblogs.com/wxios/p/4174988.html