Инструменты и утечки памяти - PullRequest
1 голос
/ 28 июля 2011

Я использую инструмент утечки в инструментах 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 Ответ

1 голос
/ 28 июля 2011

Найти источник утечки - не всегда простая задача, а помощь удаленно еще сложнее.

В вашем случае может помочь небольшая стрелка, которая отображается рядом с адресом памятиутечка.Если вы щелкнете по нему, вы увидите информационную панель с полной трассировкой стека в этот момент.Изучите список методов, представленных там, и найдите какой-нибудь свой метод, а затем щелкните по нему, чтобы проверить код.

В инструментах больше ничего нельзя сделать, чтобы получить представление о том, где был обнаружен протекший объект. создан .Затем вы должны выяснить, где вы могли пропустить его выпуск.

Что касается Apple SDK, сообщается о нескольких утечках памяти, которые вы можете найти в Интернете, но они действительно редко встречаются.

Если Instruments не помогает вам, один важный вопрос для вас: что делало ваше приложение, когда Instruments сообщало об утечке?Извлечение данных из Интернета, отображение нового вида, что угодно ... это может помочь в определении границ вашего дальнейшего расследования.Если утечки обнаруживаются несколько раз, это также может быть очень полезно для определения того, какая часть вашей программы может их создавать.

Если вы получите подсказку об этом, то проверьте код, который это выполняет.Один из методов (я знаю, что это может звучать странно, но попробуйте) удаляет / комментирует фрагменты кода, а затем проверяет, есть ли утечка.

«Удаление / комментирование фрагментов кода»может означать много вещей, от отказа от веб-запроса, до того, чтобы избежать использования класса одного типа и замены его другим.Это не всегда простой процесс, потому что вы нарушаете функциональность приложения, поэтому вам нужно использовать свои знания о том, как удалить функциональность и оставить ваше приложение «тестируемым».Если вам повезет, это может помочь вам в дальнейшем разделить код, который вызывает утечку.

Имейте в виду, что инструмент статического анализа также может помочь, и что утечки не идеальны, иногда это неправильно.Существует другая методика обнаружения утечек, которая основана не на утечках, а на распределении объектов.По моему опыту, это очень важно, и я настоятельно рекомендую вам попробовать это, хотя я подозреваю, что это не поможет в этом случае.Это называется анализ кучи .

...