UIImagePickerController Утечка памяти - PullRequest
8 голосов
/ 02 июля 2011

Я вижу огромную утечку памяти при использовании UIImagePickerController в моем приложении для iPhone. Я использую стандартный код из документов Apple для реализации контроля:

    UIImagePickerController* imagePickerController = [[UIImagePickerController alloc] init];
    imagePickerController.delegate = self;
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {

        switch (buttonIndex) {
            case 0:
                imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
                [self presentModalViewController:imagePickerController animated:YES];
                break;
            case 1:
                imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
                [self presentModalViewController:imagePickerController animated:YES];
                break;
            default:
                break;
        }
    }

А для отмены:

-(void) imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
    [[picker parentViewController] dismissModalViewControllerAnimated: YES];
    [picker release];
}

Обратный вызов didFinishPickingMediaWithInfo такой же стандартный, хотя мне даже не нужно ничего выбирать, чтобы вызвать утечку.

Вот что я вижу в инструментах, когда все, что я делаю, это открываю UIImagePickerController, выбираю библиотеку фотографий и нажимаю несколько раз кнопку отмены. Как вы можете видеть, память продолжает расти, и в конечном итоге это приводит к значительному замедлению работы приложения для iPhone

enter image description here

Как вы можете видеть, я открывал средство выбора изображений 24 раза, и каждый раз он выдавал malloc 128 КБ, который никогда не выпускался. В основном 3 МБ из моих общих 6 МБ никогда не выпускаются.

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

Вот что я вижу, когда углубляюсь в эти две строки:

enter image description here

Любая помощь здесь будет принята с благодарностью! Опять же, мне даже не нужно выбирать изображение. Все, что я делаю, это представляю контроллер и нажимаю кнопку отмены.

Обновление 1

Я скачал и запустил Apple пример использования UIIMagePickerController, и я вижу, что там происходит та же утечка при работе инструментов (как в симуляторе, так и на телефоне).

http://developer.apple.com/library/ios/#samplecode/PhotoPicker/Introduction/Intro.html%23//apple_ref/doc/uid/DTS40010196

Все, что вам нужно сделать, - это нажать кнопку библиотеки фотографий и нажать кнопку отмены снова и снова, и вы увидите, что память продолжает расти.

Есть идеи?

Обновление 2

Я вижу эту проблему только при просмотре библиотеки фотографий. Я могу выбрать сфотографировать, и открывать и закрывать это снова и снова, без утечки.

Ответы [ 5 ]

5 голосов
/ 05 июля 2011

Это ошибка в SDK. Подайте отчет в Apple. У меня есть такая же. Здесь также задокументировано: http://www.cocoabuilder.com/archive/cocoa/285293-iphone-memory-leak-can-explain.html и это было больше года назад и до сих пор не исправлено.

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

Некоторые наши приложения повторно используют один и тот же UIImagePickerController из-за утечки в 2.x (это заставляет меня чувствовать себя старым ...). У меня сложилось впечатление, что утечка устранена, но я могу ошибаться.

Это немного ужасный обходной путь, но иногда это лучшее, что вы можете сделать.

0 голосов
/ 18 декабря 2012

Я использовал UIImagePickerController, и после 40 снимков мое приложение получило сообщение DidMemoryWarning и остановилось, скрыв все мои просмотры.

В моем приложении я создал 40 объектов

UIImagePickerController( new UIImagePickerController() )

Для правильной работы я создаю уникальный экземпляр, общий для всех приложений, и с этим все работает корректно.

Я предполагаю, что управление тоже потеряло память, но только один раз.Мое приложение может правильно захватывать изображения с камеры:

private static UIImagePickerController picker = new UIImagePickerController();
0 голосов
/ 02 июля 2011

Кнопка «Mark Heap» в инструментах была для меня абсолютно лучшим способом для отслеживания подобных проблем.

Это OK статья о том, как его использовать: http://www.friday.com/bbum/2010/10/17/when-is-a-leak-not-a-leak-using-heapshot-analysis-to-find-undesirable-memory-growth/

Но он точно скажет вам, какие объекты выживают дольше, чем вы ожидаете ... и, в конечном счете, каков источник проблемы.

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

РЕДАКТИРОВАТЬ: Я также использую UIImagePickerControllers, и я могу обещать, что он не протекает (для меня Lesat), как вы предлагаете - так что, что бы ни происходило, это почти наверняка можно исправить.

0 голосов
/ 02 июля 2011

Попробуйте установить UIImagePickerController.delegate на nil перед выпуском.

-(void) imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
    [[picker parentViewController] dismissModalViewControllerAnimated: YES];
    picker.delegate = nil;
    [picker release];
}
...