天天看點

[Object C]_[初級]_[Object C之記憶體管理]

在項目中,經常會程式崩潰,記憶體增大等問題,影響程式的性能,出現這個問題的原因就是記憶體洩露,建立的對象沒有釋放,或者是對象被多次釋放。是以記憶體管理對于整個項目來說是非常重要的。

記憶體管理常用的幾個方法

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;
}
           

運作結果:

[Object C]_[初級]_[Object C之記憶體管理]

繼續閱讀