OC基础—内存管理之set方法内存管理

------ android培训java培训、期待与您交流! ----------


                   set方法内存管理

我们来看一下,最严谨的方法

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

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

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

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

@end

#import "Person.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
{
    // 基本数据类型不需要retain
    _age = age;
}
- (int)age
{
    return _age;
}

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

@end

首先来看看dealloc方法

dealloc方法的代码规范

 1. 一定调用[super dealloc],一定放到最后面

 2. 对当前对象所拥有的其它对象,做一次release

 - (void)dealloc

 {

    [_car release];  // 当人不在了,也代表着不想用车了那么就要给车做一次release

    [super dealloc];

 }


再来看看set方法

 - (void)setCar:(Car *)car
 {
    // 1.先判断传进来的是否为新对象
    if ( car != _car)
    {
        // 2.对旧对象进行一次release
        [_car release];
 
        // 3.对新对象进行一次retain
        _car = [car retain];
    }
 }

这是最严谨的set方法,这样最遵循内存原则

现在我们来看一个错误写法

Student *stu = [[Student alloc] init];
stu.car = [[Car alloc] init];
[stu release];
这代码看起来没有问题,可是这存在内存泄露问题

先看一下stu,刚创建的时候计数器为1,后面没有变化,最后release一次计数器为0,没有问题。

再来看看car呢。

stu.car = [[Car alloc] init];
右边Car刚创建时计数器为1,stu.car方法计数器为2,当stu释放car的计数器-1,最后car的计数器一直为1,无法释放。

这样的代码就可以称为垃圾代码。



------ android培训java培训、期待与您交流! ----------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值