仪器和内存泄漏

时间:2011-07-28 14:30:16

标签: objective-c ios memory-management memory-leaks instruments

我正在使用XCode工具中的泄漏工具来查找内存泄漏(如图所示)。每次我在应用程序的不同位置运行我的应用程序时,我都会有一些泄漏。我看一下扩展的细节,我从来没有指出我编写的任何代码,只有代码构建在xcode的基础之上。两个例子是:

http://imageshack.us/photo/my-images/192/screenshot20110728at102.png/

http://imageshack.us/photo/my-images/853/screenshot20110728at102.png/

如您所见,一些问题来自Message UI库。我唯一使用的地方是:

-(void)displayComposerSheet
{
    MFMailComposeViewController *mail = [[MFMailComposeViewController alloc] init];
mail.mailComposeDelegate = self;

[mail setSubject:@"Suggestions"];

[mail setToRecipients:[NSArray arrayWithObjects:@"sampleEmail@gmail.com", nil]];
[self presentModalViewController:mail animated:YES];
[mail release];
}

-(void)launchMailAppOnDevice
{
NSString *recepient = [NSString stringWithFormat:@"mailto:sampleEmail@gmail.com"];
recepient = [recepient stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:recepient]];
}

-(void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error
{
[self dismissModalViewControllerAnimated:YES];
}

我该如何解决这个问题?谢谢!

1 个答案:

答案 0 :(得分:1)

找出泄漏的来源并不总是一件容易的事,远程帮助更加复杂。

在您的情况下,可能有帮助的是泄漏的内存地址旁边显示的小箭头。如果单击它,则应显示一个信息窗格,其中包含当时的完整堆栈跟踪。检查那里提供的方法列表并查找您的方法,然后单击它以检查代码。

您可以在乐器中做很多其他事情来了解泄漏对象创建的位置。然后你应该弄清楚你可能错过了释放它的位置。

对于Apple SDK,报告了一些内存泄漏,您可以在网上找到它们,但它们实际上很少。

如果Instruments没有帮助您,那么您需要考虑的一个重要因素是:当仪器报告泄漏时您的应用程序在做什么?从网络上检索数据,显示新视图,无论如何......这有助于划分您进一步调查的领域。如果泄漏多次出现,这对于确定程序的哪个部分可能产生它也是一个很大的价值。

如果您对此有所了解,请查看完成该操作的代码。一种技术(我知道它可能听起来很奇怪,但尝试一下)是删除/注释掉代码块,然后检查泄漏是否仍然存在。

“删除/注释掉代码块”可能意味着许多事情,从不发出Web请求,避免使用类的类并将其替换为另一类。这并不总是一个简单的过程,因为您会损害应用程序功能,因此您必须使用有关如何删除功能以及让应用程序“可测试”的知识。如果幸运的话,这可以帮助您进一步划分导致泄漏的代码。

请记住,静态分析工具也可以提供帮助,泄漏并不完美,有时候是错误的。还有另一种技术可以发现泄漏,而不是基于泄漏,而是基于对象分配。这在我的经验中是非常强大的,我强烈建议你也尝试这一点,尽管我怀疑在这种情况下它无济于事。它被称为heapshot analysis

相关问题