黑马程序员_set方法内存管理



黑马程序员_set方法内存管理

内存管理代码规范:
1.只要调用alloc,必须有release(autorelease)
  如果对象不是通过alloc产生的,就不需要release

2.set方法代码规范:
  * 基本数据类型:直接赋值
    - (void)setAge:(int)age
    {
     _age = age;
    }

  * OC对象类型
- (void)setCar:(Car *)car
{
 // 1.先判断是不是新传进来的对象
 if ( car != _car )
 {
  // 2.对旧对象做一次release
  [_car release];
 
  // 3.对新对象组一次retain; 并赋值给_car
  _car = [car retain];
 }
}

3.dealloc方法的代码规范
  * 一定要调用[super dealloc]; 一定要放到最后面。
 
  * 对当前对象(self)所拥有的其他对象做一次release
- (void)dealloc
{
 [_car release];

 [super dealloc];
}


#import <Foundation/Foundation.h>

/****************** Person ******************/
@interface Person : NSObject
{
	Car *_car;
	int _age;
}

- (void)setAge:(int)age;
- (int)age;

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

@end

@implementation Person

- (void)setAge:(int)age
{
	// 基本数据类型是不需要管理内存的
	_age = age;
}

- (int)age
{
	return _age;
}

- (void)setCar:(Car *)car
{
	// 对当前正在使用的车(旧车)做一次release
	if ( car != _car )
	{
		[_car release];	// 第一次赋值时 [nil release]什么也不做

		// 对新车做一次retain操作
		_car = [car retain];
	}
}

- (Car *)car
{
	return _car;
}

- (void)dealloc
{
	// 当Person对象回收了,代表不用Car对象了
	// 对Car对象做一次release操作
	[_car release];

	NSLog (@"Person --- -dealloc: age = %d", _age);
	
	[super dealloc];
}

@end


/****************** Car ******************/
@interface Car : NSObject
{
	int _speed;
}

- (void)setSpeed:(int)speed;
- (int)speed;

@end

@implementation Car

- (void)setSpeed:(int)speed
{
	_speed = speed;
}

- (int)speed
{
	return _speed;
}

- (void)dealloc
{
	/*
 	 * _speed	: 直接访问成员变量
	 * self->speed	: 直接访问成员变量
	 * self.speed	: 通过get方法访问成员变量
	 * [self speed]	: 通过get方法访问成员变量
	 */

	NSLog (@"Car --- -dealloc: speed = %d", _speed);	
	// _speed == self.speed == self->_speed;

	[super dealloc];
}

@end


/****************** Dog ******************/
@interface Dog : NSObject

@end

@implementation Dog

@end


/****************** Student ******************/
@interface Student : NSObject
{
	int _no;
	NSString *_name;
	car *_car;
	Dog *_dog;
}

- (void)setNo:(int)no;
- (int)no;

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

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

- (void)setDog:(Dog *)dog;
- (Dog *)dog;

@end

@implementation Student

- (void)setNo:(int)no
{
	_no = no;
}

- (int)no
{
	return _no;
}

- (void)setName:(NSString *)name
{
	if ( name != _name )
	{
		[_name release];
		_name = [name retain];
	}
}

- (NSStirng *)name
{
	return _name;
}

- (void)setCar:(Car *)car
{
	if ( car != _car )
	{
		[_car release];
		_car = [car retain];
	}
}
- (Car *)car
{
	return _car;
}

- (void)setDog:(Dog *)dog
{
	if ( dog = _dog )
	{
		[_dog release];
		_dog = [dog retain];
	}
}
- (Dog *)dog
{
	return _dog;
}

- (void)dealloc
{
	[_name release];
	[_dog release];
	[_car release];

	[super dealloc];
}

@end

/****************** main ******************/
int main()
{
	// stu-1
	Student *stu = [[Student alloc] init];

	// car-2
	// 这行代码有内存泄漏
	// stu.car = [[Car alloc] init];

	// stu-0; car-1
	[stu release];

	// 这行代码有内存泄漏
	// [Car alloc] init].speed = 100;

	return 0;
}

void test3()
{
	Student *stu = [[Student alloc] init];
	
	Car *c = [[Car alloc] init];
	stu.car = c;

	Dog *d = [[Dog alloc] init];
	stu.dog = d;

	
	stu.name = @"jack";
	
	[d release];
	[c release];
	[stu release];	
}

void test2()
{
	Person *p1 = [[Person alloc] init];
	p.age = 20;

	Car *c1 = [[Car alloc] init];
	c1.speed = 100;

	p1.car = c1;

	Car *c2 = [[Car alloc] init];
	c2.speed = 200;

	[c2 release];
	[c1 release];	
	[p1 release];
}

void test1()
{
	// p-1
	Person *p = [[Person alloc] init];
	p.age = 20;

	// c1-1
	Car *c1 = [[Car alloc] init];
	c1.speed = 250;

	// c1-2
	p.car = c1;

	// c1-1
	[c1 release];

	// c1-0 僵尸对象
	// p.car = c1;
	
	[p release];
}

void test()
{
	// p-1
	Person *p = [[Person alloc] init];
	p.age = 20;

	// c1-1
	Car *c1 = [[Car alloc] init];
	c1.speed = 250;

	// p想拥有c1
	// c1-2
	p.car = c1;	// [p setCar:c1];

	// c2-1
	Car *c2 = [[Car alloc] init];
	c2.speed = 300;

	// p将车换成了c2
	// c2-2; c1-1;
	p.car = c2;
	
	// c2-1
	[c2 release];

	// c1-1
	[c1 release];

	// p-0; c2-0; c1-0;	
	[p release];
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
大学生参加学科竞赛有着诸多好处,不仅有助于个人综合素质的提升,还能为未来职业发展奠定良好基础。以下是一些分析: 首先,学科竞赛是提高专业知识和技能水平的有效途径。通过参与竞赛,学生不仅能够深入学习相关专业知识,还能够接触到最新的科研成果和技术发展趋势。这有助于拓展学生的学科视野,使其对专业领域有更深刻的理解。在竞赛过程中,学生通常需要解决实际问题,这锻炼了他们独立思考和解决问题的能力。 其次,学科竞赛培养了学生的团队合作精神。许多竞赛项目需要团队协作来完成,这促使学生学会有效地与他人合作、协调分工。在团队合作中,学生们能够学到如何有效沟通、共同制定目标和分工合作,这对于日后进入职场具有重要意义。 此外,学科竞赛是提高学生综合能力的一种途径。竞赛项目通常会涉及到理论知识、实际操作和创新思维等多个方面,要求参赛者具备全面的素质。在竞赛过程中,学生不仅需要展现自己的专业知识,还需要具备创新意识和解决问题的能力。这种全面的综合能力培养对于未来从事各类职业都具有积极作用。 此外,学科竞赛可以为学生提供展示自我、树立信心的机会。通过比赛的舞台,学生有机会展现自己在专业领域的优势,得到他人的认可和赞誉。这对于培养学生的自信心和自我价值感非常重要,有助于他们更加积极主动地投入学习和未来的职业生涯。 最后,学科竞赛对于个人职业发展具有积极的助推作用。在竞赛中脱颖而出的学生通常能够引起企业、研究机构等用人单位的关注。获得竞赛奖项不仅可以作为个人履历的亮点,还可以为进入理想的工作岗位提供有力的支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值