下面的两种方法都分配一个 NSString 并泄漏它。运行 XCode (4.6) Anaylzer 成功标记了 bar2 中的泄漏,但在 bar1 中没有提及它。
我不明白为什么。
在我的实际项目中,我们发现了一个泄漏,我们希望以一种明显的方式捕获它,就像 bar2 中的那样,但由于 bar1 中的行为相同,它没有被发现。
请帮我理解为什么。谢谢!
-(void)bar1
{
NSString* foo = [[NSString alloc] initWithString:@"foo"];
NSLog(@"%@", foo);
for (int i=0; i<4; i++) {
}
}
-(void)bar2
{
NSString* foo = [[NSString alloc] initWithString:@"foo"];
NSLog(@"%@", foo);
}
你们中的一些人提到静态字符串的情况是“过分做作的”。这个不那么做作的示例显示了相同的行为:
-(void)bar1
{
NSString* foo = [[NSString alloc] initWithFormat:@"%d",rand()];
NSLog(@"%@", foo);
for (int i=0; i<4; i++) {
}
}
-(void)bar2
{
NSString* foo = [[NSString alloc] initWithFormat:@"%d",rand()];
NSLog(@"%@", foo);
}
感谢那些指出迭代次数会产生影响的人。使用 3,它报告泄漏,使用 4,它不报告。这是一个没有死代码的新示例,只有迭代不同:
报告泄漏:
-(void)bar1
{
int i=0;
while (i<3) {
i++;
}
NSString* foo = [[NSString alloc] initWithFormat:@"%d",i];
NSLog(@"%@", foo);
}
不报告泄漏:
-(void)bar2
{
int i=0;
while (i<4) {
i++;
}
NSString* foo = [[NSString alloc] initWithFormat:@"%d",i];
NSLog(@"%@", foo);
}
我已经向 Apple 开具了 DTS 票证,因为在我看来,这个精致的示例清楚地表明这是 Analyzer 中的一个错误。
DTS 要求我使用https://bugreport.apple.com将其作为错误打开,我已经完成了。这是问题 ID 13491388。
2013 年 3 月 29 日更新:Apple 报告我的错误 13491388 是错误 11486907 的欺骗。但是,我无法打开或阅读有关错误 11486907 的任何内容,因此该信息完全无用。
苹果开发者支持失败:-(