2010-08-19 92 views
1

快速的问题,仪器公司报告在这里泄漏...为什么Instruments在此代码中报告内存泄漏?

MyViewController *myVC = [[MyViewController alloc] initWithNibName:@"myView" bundle:nil];  
[self.navigationController pushViewController:myVC animated:YES]; //<<<<---- !00% leak according to Instruments 
[myVC release]; 

我明白myVC由导航控制器保留的,所以我认为导航控制器释放他们时,认为被弹出堆栈资产净值?

此外,还有另一个棘手的一个在我的环之一,静态分析仪在这里报告一个潜在的泄漏...

//Walk through the scheduled alarms and create notifications 
NSMutableArray *fireDates = [[NSMutableArray alloc] init]; 
for(NSDate *fireDate in fireDates)   //<<<<---- Static analyzer is reporting potential leak here 
{ 
    UILocalNotification *localNotif = [[UILocalNotification alloc] init]; 
    if (localNotif == nil) 
    { 
     [fireDates release]; 
     return; 
    } 

    localNotif.fireDate = fireDate; 
    localNotif.timeZone = [NSTimeZone defaultTimeZone]; 

    localNotif.alertBody = [NSString stringWithFormat:@"%@", alarm.Label]; 
    localNotif.alertAction = NSLocalizedString(@"Launch", nil); 

    localNotif.soundName = UILocalNotificationDefaultSoundName; 

    localNotif.userInfo = infoDict; 
    localNotif.repeatInterval = NSWeekCalendarUnit; 

    [[UIApplication sharedApplication] scheduleLocalNotification:localNotif]; 
    [localNotif release]; 

} 
[fireDates release]; 

我需要以某种方式释放fireDate?

在此先感谢您的帮助!

+0

静态分析仪一般都很好......也许不要忽略缺少的代码... – Eiko 2010-08-19 21:16:02

+0

谢谢,Eiko,我刚刚更新了我的问题以包含缺少的代码。你的想法? – BeachRunnerFred 2010-08-19 21:23:24

+0

你正在模拟器或设备上运行测试吗?我注意到对模拟器,泄漏程序显示错误的泄漏。 – 2010-08-19 21:35:39

回答

1

这些代码片段都很好,就像片段一样。如果你没有看到你的完整代码,就不可能说你是否在其他地方做一些愚蠢的事情。你有没有释放你的导航控制器(可能在你的应用代理-dealloc)?这是一个没有多大意义的漏洞,但它可能是引发第一次警告的原因。


编辑:至于第二个片段中,代码看起来不错(虽然快捷回报的情况下会打扰一些程序员,谁更愿意看到一个break语句)。静态分析器可能会受到条件收益中缺少[localNotif release](尽管显然没有必要)的困扰。

+0

谢谢,seamus!不,我不会在我的应用程序委托的-dealloc中释放导航控制器,因为导航控制器是在我的笔尖mainwindow.xib nib文件中创建的。因此,我不应该在我的-dealloc中释放它,对吧? – BeachRunnerFred 2010-08-19 21:21:08

+0

你有导航控制器的插座吗? – christo16 2010-08-19 21:41:56

+0

@ christo16 - 不,我不这样做,因为我的导航控制器没有实例变量。我只是使用[自我导航控制器]的一切。你的想法? – BeachRunnerFred 2010-08-19 21:45:00

0

在第一个片段中,什么被泄漏?仪器会告诉你它被分配的位置,这通常不是对泄漏“负责”的线路(当然,因为它会给你返回地址,而不是呼叫地址,所以线路号码往往是关闭的)。我假设它是MyViewController被泄漏,并且这些工具实际上是在抱怨alloc(查看回溯,cmd -E我认为)。

如果您单击内存地址旁边的箭头(您可能需要点击鼠标左键并将鼠标悬停在泄漏地址上;我不记得),您会看到所有的alloc/retain/release/autorelease/malloc/free/CFRetain/CFRelease调用该地址。忽略alloc之前的那些(那些发生在相同地址的前一个对象)。匹配保留和(自动)发布。您可以将autorelease与相应的(延迟)版本相匹配,因为在释放NSAutoreleasePool时(这在堆栈跟踪中很明显)会发生延迟版本。寻找没有匹配(自动)版本的保留。这是泄漏。

在第二种情况下,如果您告诉我们Clang SA告诉您什么(点击左边的小三角并展开以向您显示发生泄漏的控制流),它会有所帮助。

但我不认为循环运行完全,因为fireDates是空的。

相关问题