Custom KeyBoard прекращает работу из-за нехватки памяти в iOS 8

Custom KeyBoard прекращает работу из-за нехватки памяти в iOS 8

Первоначально моя пользовательская клавиатура занимает около 25 МБ памяти, но эта память не освобождается, когда я убираю клавиатуру. Память продолжает увеличиваться, когда мы снова и снова открываем пользовательскую клавиатуру и, наконец, прекращаем работу из-за нехватки памяти.

Помогите мне с этой проблемой?


person Rachit    schedule 10.10.2014    source источник
comment
Можете ли вы опубликовать свой код, где вы точно столкнулись с проблемой?   -  person iGW    schedule 10.10.2014


Ответы (3)


Вы можете освободить некоторые вещи в функции ViewWillDisappear KeyboardViewController.

person Tatiana    schedule 27.10.2014

Расширение клавиатуры запускается в процессе, который сохраняется после исчезновения клавиатуры. Контроллер представления вашей клавиатуры создается заново каждый раз, когда создается ваша клавиатура, но процесс, в котором находится контроллер представления, сохраняется. Итак, освободите память, когда ваш контроллер представления закрыт. Если вы используете изображения, вы не захотите использовать imageNamed: вы захотите использовать imageWithContentsOfFile:. Поскольку UIImage использует кеш для imageNamed, который будет сохраняться.

person Mark Johnson    schedule 19.03.2015

Я испробовал множество способов избежать этой знаменитой проблемы накопления памяти, но, согласно моим долгим пробам и ошибкам, лучший и самый простой способ освободить всю память до исчезновения клавиатуры — это вызвать 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 МБ за одно закрытие). Если использование памяти увеличивается после многих отклонений, даже если пользовательские объекты освобождаются в максимально возможной степени, выход (0) может вызываться периодически с некоторым риском выгрузки.

person NeonBerry    schedule 25.09.2015
comment
Я занимаюсь этим вопросом, как и вы. Я пробовал exit(0); это очень эффективно. Это просто убивает процесс. Однако это будет замедлять клавиатуру при каждом вызове. Я думаю, что iOS кэширует клавиатуру, чтобы ускорить процесс. Я пытался удалить все подпредставления, ограничения, но кажется, что процесс все еще там, и память все еще увеличивается каждый раз, когда я использую клавиатуру :( - person TomSawyer; 29.01.2016
comment
В общем, все пользовательские объекты, которые вы создали, должны быть удалены в viewWillDisappear, прежде чем они исчезнут. Но дело в том, что вы должны удалить все пользовательские объекты, а не только пользовательские представления и ограничения, чтобы предотвратить утечку памяти iOS и, в конечном итоге, сбой клавиатуры. Проверьте, удалили ли вы также массивы, словари, наборы или любые объекты, которые вы создали. Это действительно раздражает, но работает. - person NeonBerry; 01.02.2016
comment
Я удалил все включенные объекты: экземпляр класса, ограничения, представления, словари... И некоторые приложения не запустились, как (viber), я не знаю почему. Я должен оставить некоторые переменные. И если я уже удалил все виды, нужно ли мне также удалять ограничения и жесты? По сути, если я удалил представления, ограничения также будут автоматически удалены. - person TomSawyer; 01.02.2016
comment
Кстати, вы удалили всю пользовательскую иерархию представлений? То есть пользовательские подпредставления пользовательского представления должны быть удалены вручную. Случай с массивами или еще один и тот же. Подмассивы массива должны быть удалены вручную. Кроме того, все пользовательские ограничения должны быть удалены вручную. Жесты имеют очень небольшой размер, но их необходимо удалять вручную, даже если память все еще увеличивается. Очень раздражает, но выбора нет... спасибо iOS. - person NeonBerry; 02.02.2016