前言
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
总结
以上就是如何保证单个对象能够被完美的回收!