在項目中,經常會程序崩潰,內存增大等問題,影響程序的性能,出現這個問題的原因就是內存泄露,創建的對象沒有釋放,或者是對象被多次釋放。所以內存管理對於整個項目來說是非常重要的。
內存管理常用的幾個方法
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;
}
運行結果: