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

来源:互联网 发布:freebsd 安装python 编辑:程序博客网 时间:2024/05/18 03:36

------ 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培训、期待与您交流! ----------

0 0