2017-06-08 133 views
0

我有這樣的代碼(從教程中,我以下修改):爲什麼不給內存泄漏?

#import <Foundation/Foundation.h> 


@class Car; 
@class Person; 

@interface Person: NSObject 

@property Car* owningCar; 

@end 


@implementation Person:NSObject 

-(void)dealloc { 
    NSLog(@"Person is gone"); 
} 

@end 


@interface Car:NSObject 

@property Person* owner; 

@end 

@implementation Car:NSObject 

-(void)dealloc { 
    NSLog(@"Car is gone"); 
} 

@end 




void testRefCycle() { 
    Person* me = [[Person alloc] init]; 
    Car* civic = [[Car alloc] init]; 
    me.owningCar = civic; 
    civic.owner = me; 
} 



int main(int argc, const char * argv[]) { 
    @autoreleasepool { 
     testRefCycle(); 
    } 
    return 0; 
} 

我打開了探查泄漏,並運行它,希望得到泄漏,但沒有顯示出來。如果創建參考週期,爲什麼沒有泄漏?

當我運行該項目時,也沒有輸出。如果沒有泄漏,爲什麼沒有輸出?

回答

0

There is a leak,這就是爲什麼沒有輸出 - 您的dealloc方法永遠不會運行。

但是泄漏檢測器從來沒有機會檢測到它,因爲您的程序以百萬分之一秒結束。從長遠來看,你沒有任何持久性狀態,這就是所謂的漏洞所需要的。

如果您在應用程序中運行testRefCycle,例如,應用程序本身持續存在一段時間,則會看到報告的泄漏。但是你不會在沒有運行循環的單行命令行程序中看到它,這就是你所擁有的。

+0

這是非常奇怪的,它只在第6秒鐘捕獲泄漏,最後我添加了一個'getchar'。我想Profiler確實有其侷限性。 – texasbruce

+0

探查器的工作原理是每隔幾秒鐘暫停應用程序並拍攝已用指針的快照。所以如果你的程序運行時間不夠長,它將沒有足夠的數據。像這樣測試短代碼的簡單方法是將其放在一個循環中,並運行幾千次左右。這樣做的另一個優點是任何小的泄漏都經常重複以至於更容易發現。 – uliwitness