在项目中,经常会程序崩溃,内存增大等问题,影响程序的性能,出现这个问题的原因就是内存泄露,创建的对象没有释放,或者是对象被多次释放。所以内存管理对于整个项目来说是非常重要的。
内存管理常用的几个方法
autorelease:把对象放到最近的内存池里,程序结束自动释放内存
release:引用计数减1,释放内存
retain:引用计数加1,对象拷贝了一份
retainCount:记录对象被引用的次数
dealloc:引用计数为0,自动调用该方法,把创建的对象进行销毁。
例子:
MyClass.h
#import <Foundation/Foundation.h>
@interface MyClass : NSObject
{
NSString* name;
}
@property (readwrite,copy) NSString* name;
@end
MyClass.m
import "MyClass.h"
@implementation MyClass
@synthesize name;
-(id) init
{
self =[super init];
if(self)
{
NSLog(@"构造iCount:%ld",self.retainCount);
}
return self;
}
//引用计数为0时,调用该方法
-(void) dealloc
{
NSLog(@"析构iCount:%ld",self.retainCount);
[super dealloc];
}
@end
main.m
#import <Foundation/Foundation.h>
#import "MyClass.h"
int main(int argc, const char * argv[]) {
NSAutoreleasePool *pool =[NSAutoreleasePool new];
NSMutableArray* array =[[NSMutableArray alloc] init];
for (int i =0; i<6; i++)
{
MyClass *ii =[[MyClass alloc] init];
[ii setName:[NSString stringWithFormat:@"name%d",i+1]];
[array addObject:ii];//ii被复制了一份,引用计数加1
//[ii release]; //引用计数减1
//输出是1,如果把[ii release]取消注释,输出是2.
NSLog(@"addobject ii:%ld",[ii retainCount]);
}
//[array retain];
//如果把[array retain];取消注释,输出是2.
NSLog(@"array:%ld",[array retainCount]);
[array release];//引用计数减1
//retain
MyClass *object =[MyClass new];
[object setName:@"object"];
//如果[object release]; temp指向的是一个无效的指针,运行报错
//如果对[object retain],把object拷贝了一份,引用计数加1.
MyClass *temp =[object retain];//赋值不拷贝一份,运行到[temp release]会报错
NSLog(@"name:%@",temp.name);
[object release];
[temp release];
//autorelease 把对象放到最近的内存池中,等方法调用完之后,自动释放内存
MyClass* autoObject =[[MyClass new]autorelease];
[autoObject setName:@"autoObject"];
//没有必要手动release对象,释放内存。
//[autoObject release];
[pool drain];
return 0;
}
运行结果:
