Пользовательские KeyBoard прекращаются из-за нехватки памяти в iOS 8
Пользовательские KeyBoard прекращаются из-за нехватки памяти в iOS 8
Изначально моя пользовательская клавиатура занимала около 25 Мб памяти, но эта память не освобождается, и я убираю клавиатуру. Память продолжает увеличиваться, когда мы снова и снова открываем пользовательскую клавиатуру и, наконец, теряем работу из-за нехватки памяти.
Помогите мне с этим вопросом?
3 ответа
Я испробовал множество способов избежать этой известной проблемы накопления памяти, но, согласно моим долгим долгим пробам и ошибкам, лучший и самый простой способ освободить всю память до исчезновения клавиатуры - это вызвать exit(0)
в viewWillDisappear
из KeyboardViewController
,
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
exit(0);
}
[Обновить] exit(0)
было идеально, чтобы освободить всю память, так как это убивает процесс расширения клавиатуры. К сожалению, похоже, что убийство процесса делает iOS нестабильной.
Следовательно, самый стабильный способ - высвободить все выделенные объекты в максимально возможной степени. viewWillDisappear
, Например,
Для всех пользовательских представлений и всех пользовательских контроллеров представления
Удалите все строгие ссылки на представления и контроллеры представления, такие как подпредставления, ограничения, жесты, сильный делегат и т. Д.
[aView removeFromSuperview]; [aView removeConstraints:aView.constraints]; for (UIGestureRecognizer *recognizer in aView.gestureRecognizers) [aView removeGestureRecognizer:recognizer];
Задавать
nil
ко всем свойствам объекта контроллеров представления.aViewController.anObject = nil;
Для других больших пользовательских объектов
Удалите все добавленные объекты из всех массивов, словарей и т. Д.
[anArray removeAllObjects];
Не кэшируйте изображения, используя
imageNamed:
,
В случае хорошего освобождения использование памяти во время отладки не будет увеличено или очень незначительно увеличено (<0,1 МБ на одно удаление). Если использование памяти увеличивается после многих увольнений, даже если пользовательские объекты высвобождаются в максимально возможной степени, exit(0) может периодически вызываться с некоторым риском выгрузки.
Расширение клавиатуры работает в процессе, который сохраняется после исчезновения клавиатуры. Контроллер представления клавиатуры создается заново каждый раз, когда создается клавиатура, но процесс, в котором находится контроллер представления, сохраняется. Так что свободная память, когда ваш контроллер представления закрыт. Если вы используете изображения, вы не захотите использовать imageNamed: вам захочется использовать imageWithContentsOfFile:. Потому что UIImage использует кеш для imageNamed, который будет сохраняться.
Вы можете освободить некоторые вещи в функции ViewWillDisappear KeyboardViewController