下面的两个方法都分配一个NSString并将其泄漏。运行XCode(4.6)Anaylzer成功标记bar2中的泄漏,但在bar1中没有提及它。XCode(4.6)分析仪 - 为什么在一种情况下检测到泄漏而不是另一种?
我不知道为什么。
在我的实际项目中,我们发现,我们希望在像在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);
}
我已经开了DTS门票与苹果,作为这个精致的例子,在我看来,清楚地表明,这是一个分析仪的错误。
DTS要求我打开它与https://bugreport.apple.com至极我做了一个错误。这是问题编号13491388.
更新2013年3月29日:苹果 报告说我的错误13491388是错误的欺骗11486907. 但是,我不能打开或阅读错误11486907东西,这样的信息是完全无用的。
苹果开发者支持失败:-(
在Xcode 4.6上,分析器使用警告'Using initWithString:with literal'标记代码多余的“,但没有提到任何泄漏。如果启用ARC,我不会看到任何泄漏。 – 2013-03-15 20:00:26
在该项目中,ARC被禁用。 – 2013-03-15 20:22:42
另外,是的,这里使用initWithString是愚蠢的,但它只是一个人为的例子。另一个使用init的alloc显示了同样的问题。 – 2013-03-15 20:23:20