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