Подтвердить что ты не робот

Предупреждение о принимаемой памяти. Уровень = 1 при отображении UIImagePickerController

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

Я получаю сообщение "Received memory warning. Level = 1", когда я пытаюсь показать UIImagePickerController с исходным типом = 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... все работает нормально.

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

FYI - я тестирую свое устройство 3GS.

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

4b9b3361

Ответ 1

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

Ответ 2

Речь идет не о том, сколько памяти ваше приложение использовало, потому что это, вероятно, произойдет, даже когда вы напишете очень простое приложение, которое имеет только один вид с одной кнопкой, нажав кнопку, а затем откройте камеру. Я тестировал 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] запускается при вызове метода ViewController didReceiveMemoryWarning. Комментируя это, методы viewDidUnload: и viewDidLoad: не будут вызываться. Это означает, что предупреждение mem полностью игнорируется. Это то, что мы ожидали.

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

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

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

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

Ответ 6

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

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

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

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

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

Ответ 7

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.