Получено предупреждение памяти. Уровень = 1 при отображении UIImagePickerController - PullRequest
22 голосов
/ 23 июня 2010

Это сводит меня с ума !!!

Я получаю «Предупреждение о получении памяти. Уровень = 1» всякий раз, когда я пытаюсь показать UIImagePickerController с sourceType = UIImagePickerControllerSourceTypeCamera.

Вот код из моего viewDidLoad, где я настраиваю вещи:

    - (void)viewDidLoad {

    [super viewDidLoad];

    // Set card table green felt background
    self.view.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed:@"green_felt_bg.jpg"]];


    // Init UIImagePickerController
    // Instantiate a UIImagePickerController for use throughout app and set delegate
    self.playerImagePicker = [[UIImagePickerController alloc] init];
    self.playerImagePicker.delegate = self;
    self.playerImagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
}

А вот как я представляю это модально ..

- (IBAction) addPlayers: (id)sender{
[self presentModalViewController:self.playerImagePicker animated:YES];

}

Результат... UIImagePicker начинает показывать, а затем бум ... Я получаю предупреждение памяти ... КАЖДЫЙ РАЗ!Интересно, что если я переключусь на sourceType = UIImagePickerControllerSourceTypePhotoLibrary ... все будет хорошо.

Что, черт возьми, я пропускаю или делаю неправильно?Все, что я хочу сделать, это показать камеру, сделать снимок и сохранить его.

К вашему сведению - я тестирую на своем устройстве 3GS.

Спасибо всем, кто может помочь:)

Ответы [ 7 ]

17 голосов
/ 23 июня 2010

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

6 голосов
/ 29 июля 2011

Речь идет не о том, сколько памяти использовало ваше приложение, потому что это, вероятно, произойдет, даже если вы напишите очень простое приложение, которое имеет только одно представление с одной кнопкой, нажав кнопку, а затем откроет камеру. Я тестировал на iPhone 3GS, iPad 2 и iPod touch 3G. Это случилось только в iPhone 3GS. Я обнаружил, что этого больше не произойдет, если вы перезапустите устройство до того, как запустите приложение.

Другое реальное решение - прокомментировать код [super didReceiveMemoryWarning] в вашем viewController.

- (void)didReceiveMemoryWarning
{
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

После большого количества испытаний на iPhone 3GS с iOS 4.3.2 я обнаружил, что логика может выглядеть следующим образом: -> Открыть столько, сколько приложение работает в фоновом режиме -> Представление imagePicker UIImagePickerController, нажав «Назад» или «Сохранить» из imagePicker -> Будет вызван метод ApplicationDelegate, applicationDidReceiveMemoryWarning:(UIApplication *)application -> Затем будет вызван метод ViewController, didReceiveMemoryWarning: -> Тогда viewDidUnload -> Тогда viewDidLoad

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

По умолчанию [super didReceiveMemoryWarning] запускается при вызове метода didReceiveMemoryWarning ViewController. Комментируя его, методы viewDidUnload: и viewDidLoad: не будут вызываться. Это означает, что напоминание было полностью проигнорировано. Это то, что мы ожидали.

5 голосов
/ 18 июля 2010

Теперь, после того как я обновился до 4.0, это происходит и с моим приложением - раньше в 3.1 не было никаких предупреждений.

На самом деле, как вы сказали ранее, проблем не должно быть.Однако, это заставляет представление, которое идет после этого, загружаться снова, и viewDidLoad вызывается.Это портит мое приложение, так как я инициализирую представление в viewDidLoad - теперь оно инициализируется заново - даже если это не так.

Как комментарий, это может произойти и со многими другими приложениями, которые полагаютсяпри загрузке просмотра только один раз!

4 голосов
/ 23 июля 2010

Это произошло в моем приложении. Сделал ли я это на iOS 4.0 тоже.Это было непоследовательным, но самой распространенной причиной было создание экземпляра UIImagePickerController и переход к большой фотографии, хранящейся в одном из альбомов.
Исправлено постоянным состоянием в методе didReceiveMemoryWarning и загрузкой из состояния в методе viewDidLoad.Одно предостережение: не забудьте очистить файл с сохранением состояния в правильной точке для вашего приложения.Для меня это выход из соответствующего UIViewController при нормальных обстоятельствах.

1 голос
/ 20 апреля 2015

UIImagePickerControllerDelegate - это проблема с памятью, поскольку вы захватываете большие объемы памяти, будь то изображение или видео.Поэтому с самого начала обязательно укажите параметры захвата носителя, в качестве начальной точки уменьшите это, если вам не нужно качество:

UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
picker.videoQuality=UIImagePickerControllerQualityTypeMedium;

Затем после захвата и использования этих активов.Удалите все временные файлы из временной папки приложения.Может быть дополнительным навязчивым шагом, но это хорошая привычка:

NSFileManager *fileManager = [NSFileManager defaultManager];
if ([fileManager fileExistsAtPath:[lastCapturedFile substringFromIndex:7] ]) {
    NSError *error;
    // Attempt to delete the folder containing globalDel.videoPath
    if ([fileManager removeItemAtPath:[lastCapturedFile substringFromIndex:7] error:&error] != YES) {
        NSLog(@"Unable to delete recorded file: %@", [error localizedDescription]);
    } else {
        NSLog(@"deleted file");
    }
}

С вышеупомянутым это очищает файл, который был создан делегатом.В некоторых случаях, если вы транскодируете или создаете свои собственные активы, удаляйте папку с этим файлом.Примечание выше Я удаляю часть 'file: //' строки url, так как файловому менеджеру это не нравится:

[lastCapturedFile substringFromIndex:7]

Другие вопросы, которые необходимо учитывать, описаны в различной документации о том, что выделать с этим активом - транскодирование, уменьшение размера изображения и многое другое.Помните, что любое транскодирование с использованием AVFoundation завершится сбоем, если отображается UIImagePickerViewController.

1 голос
/ 28 декабря 2010

Я борюсь с той же проблемой уже несколько дней. Тем не менее, сброс моего iPhone 4 (очистка памяти) решает проблему, поэтому это не проблема приложения.

Похоже, что предупреждение памяти уровня 1 или 2 запускает делегат UIimgPickerController для саморазгрузки. То же самое происходит в моем приложении с делегатом делегата (да, может). Однако после предупреждения о памяти он снова загрузит делегата (и его делегата), в результате чего viewDidLoad выполнит любой код, который там находится.

Я не уверен, что это происходит только при использовании UIimgPickerController, потому что тестирование всего этого занимает очень много времени.

Я мог бы написать дополнительный код, чтобы предотвратить выполнение кода в viewDidLoad en viewWillAppear при отображении UIimgPickerController, но это не классно, верно?

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

1 голос
/ 28 сентября 2010

Я также получаю предупреждение о памяти при открытии UIImagePickerController.Я тоже на 4.01.Но кроме того, UIImagePickerController запускает анимацию закрытия затвора и останавливается там с закрытым затвором на экране.

Похоже, поведение UIImagePickerController в предупреждениях памяти заключается в закрытии себя.Я мог бы отклонить UIImagePickerController из родительского ViewController в методе didReceiveMemoryWarning, но это привело бы к ужасному взаимодействию с пользователем.

Кто-нибудь видел эту проблему?Есть ли способ обработать предупреждение памяти, чтобы UIImagePickerController не закрывался сам?

...