OC内存管理二

一、内存管理的关键如何判断对象被回收?
重写dealloc方法,代码规范
(1)一定要[super dealloc],而且要放到最后,意义是:先释放子类占用的空间,在释放父 类占用的空间
(2)对self(当前)所拥有的的其他对象做一次release操作
-(void)dealloc
{
[_car release];
[super dealloc];
}
注意
1)永远不要直接通过对象调用dealloc方法(实际上调用并不会出错)
一旦对象被回收了, 它占用的内存就不再可用, 坚持使用会导致程序崩溃(野指针错误)为 了防止调用出错,可以将“野指针”指向nil(0)。

二、内存管理的原则
1)原则
只要还有人在使用某个对象,那么这个对象就不会被回收; 只要你想使用这个对象,那么就应该让这个对象的引用计数器+1; 当你不想使用这个对象时,应该让对象的引用计数器-1;
2)谁创建,谁release
(1)如果你通过alloc,new,copy来创建了一个对象,那么你就必须调用release或者 autorelease方法
(2)不是你创建的就不用你去负责
3)谁retain,谁release
只要你调用了retain,无论这个对象时如何生成的,你都要调用release
4)总结
有始有终,有加就应该有减。曾经让某个对象计数器加1,就应该让其在最后-1.

三、内存管理研究对象
1、野指针(僵尸对象)
2、内存泄露

四、单个对象的内存管理
1、单个对象的野指针问题:
野指针错误:访问了一块坏的内存(已经被回收的,不可用的内存)。
解决野指针就是 把这个对象设置为 nil , p = nil

注意:
1)空指针:没有指向任何东西的指针,给空指针发送消息不会报错

2)不能使用[p retain]让僵尸对象起死复生。

2、对象的内存泄露 的几种情形
1)retain 和 release 个数不匹配,导致内存泄露

2 )对象使用的过程中被赋值了nil,导致内存泄露 Person *p = [[Person alloc] init];

3) 在函数或者方法中不当的使用retain 或者 relase 造成的问题

五、多个对象内存管理

1、野指针
2、内存泄露
解决办法: 在保证在p对象存在的时候,car对象一定存在,对象p被销毁的时候,car对象销毁

六、set方法存在的问题
1) set方法写法(一)

原对象无法释放造成的内存泄露
-(void)setCar:(Car*)car{
_car = [car retain]; }

2、set方法写法(二)
原对象能够释放,但是引起新的问题,set自己的时候,造成的野指针
-(void)setCar:(Car*)car{
[_car release];//先释放上一个对象,(注意第一次是向nil发送release消息)
_car = [car retain]; }

3) set方法写法(三) 解决上述问题:
判断新传递的对象是否是原来的对象,如果不是原来的对象则释放,然后再retain

-(void)setCar:(Car*)car{
//判断_car 存放的是否是 形参对象,如果不是,则执行 [_car realease];
if (_car!=car) {
[_car release];//先释放上一个对象,(注意第一次是向nil发送release消息)
_car = [car retain];
}

2、set方法的内存管理

1)基本数据类型:直接赋值
int float double long struct enum -(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]; 

} }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值