Ответ 1
Это очень распространенный. Пока вы справляетесь с предупреждением о памяти без сбоев и имеете достаточное пространство для продолжения, не позволяйте ему сводить вас с ума.
Это сводит меня с ума!!!
Я получаю сообщение "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.
Спасибо всем, кто может помочь:)
Это очень распространенный. Пока вы справляетесь с предупреждением о памяти без сбоев и имеете достаточное пространство для продолжения, не позволяйте ему сводить вас с ума.
Речь идет не о том, сколько памяти ваше приложение использовало, потому что это, вероятно, произойдет, даже когда вы напишете очень простое приложение, которое имеет только один вид с одной кнопкой, нажав кнопку, а затем откройте камеру. Я тестировал 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 полностью игнорируется. Это то, что мы ожидали.
Теперь, после того, как я обновил до 4.0, это также случается с моим приложением - раньше в 3.1 не было предупреждений.
Собственно, как вы сказали ранее, не должно быть никаких проблем. Однако это вызывает представление, которое появляется после его повторной загрузки, и вызывается viewDidLoad. Это испортило мое приложение, поскольку я инициализирую представление в viewDidLoad - теперь он инициализируется снова и снова, даже если это не должно быть.
Как комментарий, это может случиться и со многими другими приложениями, которые полагаются на загрузку представления только один раз!
Это произошло в моем приложении. Я тоже сделал это на iOS 4.0. Это было непротиворечиво, но наиболее распространенной причиной было создание экземпляра UIImagePickerController
и переход на некоторую большую фотографию, хранящуюся в одном из альбомов.
Исправлено сохранение состояния в методе didReceiveMemoryWarning
и загрузка из состояния в методе viewDidLoad. Одно предостережение - не забудьте очистить файл с сохранением состояния в правильной точке вашего приложения. Для меня он оставил соответствующий UIViewController при нормальных обстоятельствах.
Я получаю предупреждение о памяти при открытии UIImagePickerController. Я тоже 4.01. Но, кроме того, UIImagePickerController запускает анимацию с закрытым затвором и останавливается там, закрывая затвор на экране.
Похоже, что поведение UIImagePickerController на предупреждениях памяти - это закрытие. Я мог бы отклонить UIImagePickerController из родительского ViewController в методе didReceiveMemoryWarning, но это создаст ужасный пользовательский интерфейс.
Кто-нибудь видел эту проблему? Есть ли способ справиться с предупреждением о памяти, чтобы UIImagePickerController не закрылся?
Я уже несколько дней борюсь с той же проблемой. Однако сброс моего iPhone 4 (очистка памяти) решает проблему, поэтому это не проблема приложения.
Кажется, что предупреждение памяти уровня 1 или 2 запускает делегат UIimgPickerController для разгрузки. То же самое происходит в моем приложении с делегатом делегата (да, может). Однако после предупреждения о памяти он снова загрузит делегат (и он делегирует), заставив viewDidLoad выполнить любой код, который там есть.
Я не уверен, что это происходит только при использовании UIimgPickerController, потому что тестирование все, что очень трудоемко.
Я мог бы написать дополнительный код, чтобы предотвратить выполнение кода в viewDidLoad en viewWillAppear при показе UIimgPickerController, но это не классно, правильно?
Здесь пища для размышлений: это может быть что у вас заканчивается память потому что вы тестируете свое приложение. С некоторые воспоминания очень хорошо возможно, что вы работаете в направлении эта проблема при каждом отладке.
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
.