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

说明:以下所有都是在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];
 }



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值