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

運行結果:



發佈了101 篇原創文章 · 獲贊 15 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章