【setter方法内存管理之一 Objective-C语言】

前言

1)用面向对象模拟一个案例:
凤姐开车去拉萨。
先找类吧?
人类:
属性:车
行为:开车
车类:
属性:速度
行为:行驶
城市类:

一、车类

@interface Car:NSObject
{
int _speed;
}
– (void)setSpeed:(int)speed;
– (int)speed;
– (void)run;
@end
@implementation Car
– (void)setSpeed:(int)speed
{
_speed = speed;
}
– (int)speed
{
return _speed;
}
– (void)run
{
NSLog(@“速度为%d的车子,在行使”,self.speed);
}
//这时候,我们为了监视Car对象的回收过程,是不重写一下dealloc方法啊?
– (void)dealloc
{
NSLog(@“时速为%d的车子,挂了。。。”,self.speed);
[super dealloc];
}
//默认情况下,这是不是1个ARC啊,我们应该先把ARC关掉
@end

二、人类

1.人是不有一辆车啊,那我们就把这个车当作人的属性

#import <Foundation/Foundation.h>
#import “Car.h”
@interface Person:NSObject
{
Car *_car;
}
– (void)setCar:(Car *)car;
– (Car *)car;
– (void)drive;
@end
@implementation Car
– (void)setCar:(Car *)car
{
//将传入的车对象,赋值给当前对象的_car属性
//代表:传入的对象,多了1个人使用。
//那么,就应该先为这个对象发送1条retain消息
//[car retain];为传进来的对象发送1条retain消息,代表多1个人使用
_car = [car retain];
}
– (Car *)car
{
return _car;
}
– (void)drive
{
NSLog(@“走,去拉萨,开车”);
[_car run];
}
– (void)dealloc
{
//当人对象挂的时候,就代表当前这个对象不会再使用_car指向的对象了
//我们说,当不再使用1个对象的时候,应该为这个对象发送1条release消息。
[_car release];
NSLog(@“人挂了…”);
[super dealloc];
}
@end

2.main.m文件

#import <Foundation/Foundtaion.h>
#import “Person.h”
int main()
{
Person *fj = [Person new];//1
Car *bmw = [Car new];//1
bmw.speed = 100;
fj.car = bmw;//bmw 2
[fj drive];
[bmw release];//bmw 1
[fj release];//fj 0
return 0;
}

如果,我让凤姐在[bmw release];之后,再开一回车,凤姐能不能开车?不能,因为车已经挂了。。。
这明显是不符合内存管理原则的,凤姐还在用这个车呢,你怎么能让车挂了呢!?
怎么解决,关键在这句话:
fj.car = bmw;
这句话,把bmw这辆车,赋值给了凤姐的下划线car属性。
根据我们之前讲的,当1个对象多了1个人使用的时候,怎么办,是不是应该给这个对象发送1条retain消息啊?
但是,有1点需要注意,就是retain这个方法有1个返回值:
– (instancetype)retain OBJC_ARC_UNAVAILABLE;
retain这个方法返回谁,是不是当前对象啊?
所以我这么写就可以了:
_car = [car retain];

三、但是,人挂了,车确没挂,这可怎么办

1)对象少1个人使用的时候,应该给车发送1条release消息,这条消息什么时候发?
凤姐自己挂了时候,是不是就不用这个对象了吧?所以,我们应该在凤姐挂了时候,给车对象发送release消息,凤姐什么时候挂,是不是dealloc时候挂啊?
凤姐的dealloc方法如下:
- (void)dealloc
{
[_car release];
NSLog(@“人挂了。。。”);
[super dealloc];
}
2)setter方法的写法:
当属性是1个OC对象的时候啊
a 将传进来的对象赋值给当前对象的属性,代表传入的对象多了1个人使用,所以我们应该先为这个传入的对象发送1条retain消息,再赋值。
b 当当前对象销毁的时候,代表属性指向的对象少1个人使用,就应该在dealloc当中,发送1条release消息。
c 代码写法:
- (void)setCar:(Car *)car
{
_car = [car retain];
}
- (void)dealloc
{
[_car release];
NSLog(@“人挂了。。。”);
[super dealloc];
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清风清晨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值