Iphone 为什么仪器在此代码中报告内存泄漏?

Iphone 为什么仪器在此代码中报告内存泄漏?,iphone,ipad,memory-management,ios,instruments,Iphone,Ipad,Memory Management,Ios,Instruments,快速提问,仪器报告这里有泄漏 MyViewController *myVC = [[MyViewController alloc] initWithNibName:@"myView" bundle:nil]; [self.navigationController pushViewController:myVC animated:YES]; //<<<<---- !00% leak according to Instruments [myVC release];

快速提问,仪器报告这里有泄漏

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

[self.navigationController pushViewController:myVC动画:是]// 这些代码段都很好。在没有看到完整代码的情况下,如果不在其他地方做一些愚蠢的事情,就不可能说出来。您是否曾经释放过navigationController(很可能是在应用程序delegate
-dealoc
中)?这是一个没有多大意义的泄漏,但它可能是触发第一个警告的原因



Edit:关于第二个代码段,代码看起来很好(尽管快捷方式返回的情况会困扰一些程序员,他们宁愿看到
break
语句)。静态分析器可能会因为条件返回中缺少
[localNotif release]
(尽管这显然是不必要的)而感到困扰

这些代码段都很好。在没有看到完整代码的情况下,如果不在其他地方做一些愚蠢的事情,就不可能说出来。您是否曾经释放过navigationController(很可能是在应用程序delegate
-dealoc
中)?这是一个没有多大意义的泄漏,但它可能是触发第一个警告的原因



Edit:关于第二个代码段,代码看起来很好(尽管快捷方式返回的情况会困扰一些程序员,他们宁愿看到
break
语句)。静态分析器可能会因为条件返回中缺少
[localNotif release]
(尽管这显然是不必要的)而感到困扰

在第一个片段中,泄露了什么?仪器将告诉您分配的线路,这通常不是泄漏的“责任”线路(当然,线路号往往是关闭的,因为它提供的是返回地址,而不是呼叫地址)。我假设是MyViewController被泄露了,而instruments实际上是在抱怨alloc(我想是cmd-E的回溯)

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

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


但我认为循环根本不会运行,因为fireDates是空的。

在第一个片段中,泄漏了什么?仪器将告诉您分配的线路,这通常不是泄漏的“责任”线路(当然,线路号往往是关闭的,因为它提供的是返回地址,而不是呼叫地址)。我假设是MyViewController被泄露了,而instruments实际上是在抱怨alloc(我想是cmd-E的回溯)

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

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



但我认为循环根本不会运行,因为
fireDates
是空的。

静态分析器通常非常好。。。也许不要忘记丢失的代码…谢谢,Eiko,我刚刚更新了我的问题,以包含丢失的代码。你的想法?你是在用模拟器还是设备进行测试?我注意到,针对模拟器,“泄漏”程序显示错误的泄漏。@joo-我正在针对模拟器运行测试。我会在我的设备上试一下,谢谢。@joo-我在设备上试过了,同样的导航控制器泄漏仍然被发现。你的想法?静态分析仪一般都很好。。。也许不要忘记丢失的代码…谢谢,Eiko,我刚刚更新了我的问题,以包含丢失的代码。你的想法?你是在用模拟器还是设备进行测试?我注意到,针对模拟器,“泄漏”程序显示错误的泄漏。@joo-我正在针对模拟器运行测试。我会在我的设备上试一下,谢谢。@joo-我在设备上试过了,同样的导航控制器泄漏仍然被发现。你的想法?谢谢你,西莫斯!不,我不会在我的应用程序代理的-dealoc中释放我的导航控制器,因为导航控制器是在我的nib mainwindow.xib nib文件中创建的。因此,我不应该在my-dealoc中释放它,对吗?你有导航控制器的插座吗?@christo16-不,我没有,因为我没有导航控制器的实例变量。我只是用[self-navigationController]处理所有事情。你的想法是什么?如果你在一个nib中有一个根视图,而它不是在一个IBOutlet中,我不知道是什么代码释放了它。我怀疑这实际上是你的泄密。尝试将IBOutlet ivar或属性添加到应用程序委托类中,并在
-dea中释放它