Всегда получать предупреждение памяти, когда с UIImagePicker для камеры - PullRequest
4 голосов
/ 29 февраля 2012

Я использую UIImagePicker в моем viewController,

и есть два вида методов, в которых я всегда получаю предупреждение о памяти, а также очень известные "wait_fences: не удалось получить ответ: 10004003",

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

// in myViewController.h

// the first 2 are the methods that I alloc my UIImagePicker,
// here, self.photoPicker is a retained property of UIImagePicker.
- (IBAction)fromAlbumButtonTapped {
    if (self.photoPicker == nil) {
        self.photoPicker = [[[UIImagePickerController alloc] init] autorelease];
        self.photoPicker.delegate = self;
    }
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) {
        self.photoPicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
        [self presentModalViewController:self.photoPicker animated:YES];
        return;
    }
}

- (IBAction)fromCameraButtonTapped {
    if (self.photoPicker == nil) {
        self.photoPicker = [[[UIImagePickerController alloc] init] autorelease];
        self.photoPicker.delegate = self;
    }
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
        self.photoPicker.sourceType = UIImagePickerControllerSourceTypeCamera;
        [self presentModalViewController:self.photoPicker animated:YES];
        return;
    }
}
// and this is another part that gives me the memory warning - getting a photo.
- (void)imagePickerController:(UIImagePickerController *)picker 
didFinishPickingMediaWithInfo:(NSDictionary *)info {
    self._photo = [info objectForKey:UIImagePickerControllerOriginalImage];
    self.photoView.photoView.image = self._photo;
    [self.photoButton setImage:self._photo forState:UIControlStateNormal];
    [self dismissModalViewControllerAnimated: YES];
}

Я уже проверил свой код и не обнаружил потенциальной утечки памяти, насколько я могу судить.

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

Но иногда проблема заключается в том, что мое viewController просто release что-то важное, когда появляется предупреждение, такое как кнопка some для возврата к контроллеру parentView в стеке навигации.

Так что я не хочу получать предупреждение памяти, если мои кнопки или что-то еще важное будет выпущено слишком рано.

Есть ли способ это исправить?

Ответы [ 3 ]

2 голосов
/ 29 февраля 2012

Не вся «потеря» памяти вызвана утечкой.Используйте Heapshot.

Используйте инструменты для проверки на утечки и потерю памяти из-за оставшейся, но не утечки памяти.Последний является неиспользованной памятью, на которую все еще указывают.Используйте Heapshot в инструменте Allocations на инструментах.

Чтобы узнать, как использовать Heapshot для поиска разрыва памяти, см .: bbum blog

По сути, существует метод для запуска инструмента выделения инструментов,сделайте снимок кучи, запустите интуицию вашего кода и повторите повторение снимка кучи 3 или 4 раза.Это будет указывать на память, которая выделяется и не освобождается во время итераций.

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

Если вам нужно увидеть, где происходят сохранения, релизы и авто-релизыдля объекта используйте инструменты:

Запустите инструменты, в разделе «Выделения» включите «Счетчик ссылок записи» (вы должны остановить запись, чтобы установить опцию).Заставьте сборщик запустить, остановить запись, найти там ivar (datePickerView), выполнить детализацию, и вы сможете увидеть, где произошли все сохранения, выпуски и автоматические выпуски.

0 голосов
/ 06 августа 2013

Измените следующее

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
[imageView setImage:image];
[self dismissModalViewControllerAnimated:YES];
}

На следующее ...

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
[self dismissModalViewControllerAnimated:YES];
[imageView setImage:image];
}
0 голосов
/ 17 октября 2012

Когда вы используете UIImagePickerController, вы получаете фотографию.Фотография может быть довольно большой.Например, для встроенной 8-мегапиксельной камеры это на самом деле 8 Мп * 3 байта, поскольку каждый пиксель является RGB, а если он не упакован, то он имеет 8 Мп * 4 = 32 МБ.Поэтому неудивительно, что вы получаете предупреждение о памяти.

Переопределите didReceiveMemoryWarning и очистите память.Кроме того, представления могут быть выгружены (до iOS 6), поэтому вы должны быть в состоянии правильно перезагрузить их в viewWillLoad.См. Управление памятью

...