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