Контроллер uiimagepickerview создает утечки памяти в iphone - почему? - PullRequest
1 голос
/ 19 сентября 2009

контроллер uiimagepickerview, создающий утечки памяти в iphone - почему?

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


-(void)addPhotos:(id)sender
{
    if(imagePickerController==nil){ 
          imagePickerController=[[UIImagePickerController alloc]init];
          imagePickerController.delegate=self;
          imagePickerController.sourceType=UIImagePickerControllerSourceTypeSavedPhotosAlbum;
        imagePickerController.allowsImageEditing=YES;
          imagePickerController.navigationBar.barStyle=UIBarStyleBlackOpaque;
    }
[self.navigationController presentModalViewController:imagePickerController animated:YES];
}

dealloc моего контроллера представления.


- (void)dealloc {
if(PhotoDateArray!=nil)[PhotoDateArray release];
if(imagePickerController!=nil) [imagePickerController release];
if(objDetail!=nil) [objDetail release];
if(Picimage!=nil) [Picimage release];
if(mySavePhotoController!=nil) [mySavePhotoController release];
if(LoadingAlert!=nil);
[super dealloc];
}

Ссылка на видео, объясняющая, как в ней возникает утечка памяти ..

http://www.yourfilelink.com/get.php?fid=508534

Ответы [ 4 ]

2 голосов
/ 19 сентября 2009

Даже если у вас есть нулевая проверка, все равно возможно утечка памяти. Я думаю, что здесь происходит то, что вы вызываете alloc / init несколько раз, но только один раз. Я предполагаю, что addPhoto: подключен к некоторому нажатию кнопки, dealloc будет вызываться только один раз, когда делегат пытается уничтожить. Это создает такую ​​ситуацию:

  • нажатие кнопки
    • alloc / init
  • нажатие кнопки
    • alloc / init (утечка памяти при первом выделении памяти)
  • закрыть окно
    • dealloc (бесплатный второй инструмент выделения ресурсов)

Лучшим способом может быть способ, которым Apple делает это в PhotoLocations и iPhoneCoreDataRecipes примеры:

UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
imagePicker.delegate = self;
[self presentModalViewController:imagePicker animated:YES];
[imagePicker release];

Затем прослушайте сообщения didFinishPickingImage и imagePickerControllerDidCancel для вашего делегата, и в обоих местах должно быть достаточно вызова [self dismissModalViewControllerAnimated:YES];.

1 голос
/ 26 января 2011

Я могу объяснить это, потому что у меня была та же проблема.

Не проверяйте память на симуляторе! Если вы тестируете код Apple на устройстве, проблема с памятью исчезает.

У меня была утечка памяти, которую я обнаружил в Инструментах. Все, что я делал, это открывал и закрывал средство выбора изображений (открывал / отменял) и использовал код Apple, мой код и код других людей, как ваш выше.

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

Затем я нашел действительно полезную веб-страницу, на которой было написано:

«Этого не происходит при тестировании на устройстве»

Итак, я переключился с симулятора и запустил тесты на устройстве. Вот, не было никакого увеличения ассигнований, и он вел себя нормально.

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

Я хочу добавить это, чтобы спасти людей, время, боль и недоумение от удивления, что происходит!

1 голос
/ 19 сентября 2009

UIImagePickerController загружает и инициализирует PhotoLibrary.framework при первом отображении. Эта память не будет восстановлена, пока ваше приложение не будет закрыто.

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

1 голос
/ 19 сентября 2009

Я не знаю об остальной части кода, но у вас когда-нибудь был релиз?

[imagePickerController release]
...