2017-06-08 94 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