您的位置:首页 > 移动开发 > Objective-C

Objective-C内存管理(三)set方法内存管理

2015-07-13 22:52 281 查看
说明:以下所有都是在MRC环境下

创建Car类

Car.h文件

@interface Car : NSObject
{
int _speed;
}
- (void)setSpeed:(int)speed;
- (int)speed;
@end
Car.m文件

#import "Car.h"

@implementation Car
- (void)setSpeed:(int)speed
{
_speed = speed;
}
- (int)speed
{
return _speed;
}

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

NSLog(@"速度为%d的Car对象被回收了", _speed);

[super dealloc];
}

@end


创建Person类

Person.h文件

#import <Foundation/Foundation.h>

@class Car;

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

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

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

@end


Person.m文件

#import "Person.h"
#import "Car.h"

@implementation Person
- (void)setCar:(Car *)car
{
if (car != _car)
{
// 对当前正在使用的车(旧车)做一次release
[_car release];

// 对新车做一次retain操作
_car = [car retain];
}
}
- (Car *)car
{
return _car;
}

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

- (void)dealloc
{
// 当人不在了,代表不用车了
// 对车做一次release操作
[_car release];
NSLog(@"%d岁的Person对象被回收了", _age);
[super dealloc];
}

@end


main.m文件

#import <Foundation/Foundation.h>
#import "Car.h"
#import "Person.h"

int main()
{
// 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
// c1-1
// c2-2
p.car = c2;

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

return 0;
}

setter方法内存管理总结:

**  1.只要调用了alloc,必须有release(autorelease)
对象不是通过alloc产生的,就不需要release

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

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

**  3.dealloc方法的代码规范
1> 一定要[super dealloc],而且放到最后面
2> 对self(当前)所拥有的其他对象做一次release
- (void)dealloc
{
[_car release];
[super dealloc];
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: