Objective-C内存泄漏混乱

时间:2009-12-31 05:32:55

标签: objective-c cocoa

显然,main方法中的以下内容会导致泄漏:

NSMutableArray *strings = [[NSMutableArray alloc] init];
[strings addObject:@"Hello"];
[strings addObject:@"Howdy"];

return 0;

并且clang LLVM报告泄漏。但是,通过Hillegass本书,我尝试分析以下代码,这些代码同样不会释放NSMutableArray对象:

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

NSMutableArray *array = [[NSMutableArray alloc] init];
NSCalendarDate *now = [[NSCalendarDate alloc] init];

for (int i=0; i < 3; i++) {
    LotteryEntry *newEntry = [[LotteryEntry alloc] init];
    NSCalendarDate *iweeksFromNow = [now dateByAddingYears:0
                                                    months:0
                                                      days:(i*7)
                                                     hours:0
                                                   minutes:0 
                                                   seconds:0];
    [newEntry setEntryDate:iweeksFromNow];
    [array addObject:newEntry];
    [newEntry release];
}

[now release];

for (LotteryEntry *entry in array) {
    NSLog(@"%@", entry);
}


[pool drain];
return 0;

这次没有报告泄漏。我错过了一些明显的东西吗?

2 个答案:

答案 0 :(得分:6)

我认为你不是 - 静态分析仪只是缺少它。 array以保留计数1结束;如果该行是

 NSMutableArray *array = [[[NSMutableArray alloc] init] autorelease];

然后封闭的自动释放池将处理它,但因为它的阵列肯定仍在泄漏。

答案 1 :(得分:0)

我在cfe-dev列表中问了这个问题,答案是循环分析在给定的阈值停止(只有2次循环迭代)。

如果您更改退出条件(为(int i = 0; i&lt; 2 ; i ++)),静态分析器将发出泄漏信号。