显然 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;
这次没有泄漏报告。我是否遗漏了一些明显的东西?
最佳答案
我不认为你是——静态分析器只是遗漏了它。 array
确实以保留计数 1 结束;如果这条线是
NSMutableArray *array = [[[NSMutableArray alloc] init] autorelease];
然后封闭的自动释放池会处理它,但就目前而言,数组肯定仍在泄漏。
关于Objective-C 内存泄漏混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1984066/