【内存泄漏 单个对象的内存管理 Objective-C语言】

前言

1)内存泄露是什么:
指的是1个对象没有被及时的回收,在该回收的时候而没有被回收
一直驻留在内存中,直到程序结束的时候才回收。
2)例如,有一个Person类:
Person.h文件:
@interface Person : NSObject
@end
Person.m文件:
@implementation Person
– (void)dealloc
{
NSLog(@“人挂了。。。”);
[super dealloc];
}
main.m文件中:
Person *p1 = [Person new];
这时候,就发生了内存泄露,因为这个p1对象,程序结束的时候才回收。

一、单个对象的内存泄露的情况:

1)有对象的创建,而没有对应的release
所以,我们要干嘛呢,有对象的创建,就要匹配一个release
Person *p1 = [Person new];
[p1 release];
这个时候,才不会发生内存泄露。
2)retain的次数,和release的次数不匹配:
例如:
Person *p1 = [Person new];
[p1 retain];
[p1 release];
3)在不适当的时候,为指针赋值为nil
例如:
Person *p1 = [Person new];
p1 = nil;
[p1 release];
这个时候,Person对象能不能回收,不能回收!
4)在方法当中,为传入的对象,进行不适当的retain
例如,有一个God对象:
God.h文件:
@interface God : NSObjecti
– (void)killWithPerson:(Person *)per
@end
God.m文件:
@implementation God
– (void)killWithPerson : (Person *)per
{
[per retain];
NSLog(@“受死吧。。。”);
}
– (void)dealloc
{
NSLog(@“挂了。。。”);
[super dealloc];
}
main.m文件中:
#import <Foundation/Foundation.h>
#import “God.h”
int main()
{
Person *p1 = [Person new];
God *g1 = [God new];
[g1 release];
[p1 release];
}
这个时候,p1 和 g1 能不能挂,可以!
那如果g1调用了killWithPerson:方法呢,p1和g1能不能挂,g1可以,p1挂不了!
例如:
int main()
{
Person *p1 = [Person new];//1
God *g1 = [God new];//1
[g1 killWithPerson:p1];//2
g1 release];//0
[p1 release];//1
}

二、如何保证单个对象可以被回收

1.有对象的创建,就必须要匹配1个release

2.retain的次数和release的次数一定要匹配

3.不要瞎赋nil,只有在指针成为野指针的时候,才赋值为nil

4.在方法当中,不要随意的为传入的对象retain

总结

以上就是如何保证单个对象能够被完美的回收!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

清风清晨

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

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

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

打赏作者

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

抵扣说明:

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

余额充值