Objective-C 【多個對象記憶體管理(野指標&記憶體流失)】

來源:互聯網
上載者:User

標籤:objective-c   多個對象記憶體管理   野指標   記憶體流失   

———————————————————————————————————————————

多個對象記憶體管理(野指標&記憶體流失)


(註:這一部分知識請結合“單個對象記憶體管理”去理解)


這一部分的知識比較簡單,就牽扯到一個會產生野指標的情形和如何避免記憶體流失問題。

代碼:

#import <Foundation/Foundation.h>

@interface Car : NSObject
-(void)run;
@end

@implementation Car

//監控Car對象有沒有被釋放
- (void)dealloc
{
    NSLog(@"Car dealloc!");
    [super dealloc];
}

-(void)run
{
    
    NSLog(@"Car run!");
}
@end

@interface Person : NSObject
{
    Car *_car;
    
}
-(void)driver;
-(void)setCar:(Car *)car;
@end

@implementation Person
- (void)dealloc
{
    [_car release];//_car 和 car指向的是同一塊記憶體空間,所以說對這兩個中任意一個執行釋放記憶體的指令都是可以的。
    NSLog(@"Person dealloc!");
    [super dealloc];
}
-(void)driver
{
    [_car run];
}
-(void)setCar:(Car *)car
{
    [car retain];
    _car=car;
   
}
@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        Person *p=[Person new];//p   1
        
        Car *car=[Car new];//car   1
        
        [p setCar:car];//car   2
        //p.car=car;  這樣寫和上面是一樣的~因為寫了set方法所以我們可以寫點文法
        
        [car release];//此時car釋放    1
        
        [p driver];//p調用driver方法,裡面會用到car這個執行個體變數去調用run方法,但是car在之前就已經被釋放了,變為了野指標,所以說就會報錯,那麼應該怎麼處理?顯然我們可以在釋放car之前retain一次,可以在setCar方法中對car對象進行retain,那樣當car執行完set方法後計數就變為2。但是這樣的話雖然不會報錯,可是car的計數又變為了1,如果不進行適當操作,又會出現記憶體流失。所以這個方法只是暫時的。但是這句話目前可以執行不會報錯。
        
        [p release];//我們在p的dealloc方法裡面加了一個 [car release];  讓car的記憶體釋放,這樣就不會出現記憶體流失了。此時p計數為0,car計數為0。
        

    }
    return 0;
}


———————————————————————————————————————————

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

Objective-C 【多個對象記憶體管理(野指標&記憶體流失)】

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.