Пользовательские 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

Другие вопросы по тегам