標籤: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 【多個對象記憶體管理(野指標&記憶體流失)】