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

Как реализовать didReceiveMemoryWarning в Swift?

Всякий раз, когда я создаю новый подкласс View Controller, Xcode автоматически добавляет метод

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated
}

Обычно я просто удаляю его или игнорирую. Это то, что и все учебные уроки, которые я видел, тоже. Но я предполагаю, что, поскольку Xcode дает это мне каждый раз, это должно быть несколько важным, не так ли? Что я должен здесь делать? Я предполагаю, что утилизация ресурсов означает их установку в нуль, но что такое "ресурсы, которые можно воссоздать"?

Я видел следующие вопросы:

Но они все до Swift. Хотя я мало что знаю о Objective-C, я слышал, что управление памятью отличается. Как это влияет на то, что я должен делать в didReceiveMemoryWarning?

Другие примечания:

  • Я смутно осознаю автоматическое подсчет ссылок и ленивую инстанцию ​​
  • documentation на didReceiveMemoryWarning, который я нашел, был довольно кратким.
4b9b3361

Ответ 1

Swift

Swift использует ARC так же, как Objective-C делает (источник в Apple Docs). Подобные правила применяются для освобождения памяти, удаления всех ссылок на объект и ее освобождения.

Как освободить память

Я предполагаю, что утилизация ресурсов означает их установку на нуль, но что такое "ресурсы, которые можно воссоздать"?

"ресурсы, которые можно воссоздать", действительно зависят от вашего приложения.

Примеры

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

  • Изображения могут занимать много памяти
  • Вам не нужны эти изображения в памяти. Если в приложении недостаточно памяти, требуется дополнительная секунда для загрузки изображения из файла.
  • Вы можете полностью сбросить кеш изображения, когда получите это предупреждение о памяти.
  • Это освободит память, которую требуется системе

Вы создаете удивительную игру с несколькими уровнями. Загрузка уровня в ваш фантастический игровой движок занимает некоторое время, поэтому, если у пользователя достаточно памяти, вы можете загрузить уровень 3, пока они играют на уровне 2.

  • Уровни занимают много памяти
  • Вам не нужен следующий уровень памяти. Им приятно иметь, но не существенно.
  • LevelCache.sharedCache().nextLevel = nil освобождает всю память

Что вы не должны освобождать

Никогда не удаляйте материал, который находится на экране. Я видел, как некоторые ответы на связанные вопросы отменяют представление UIViewController. Если вы удалите все с экрана, вы можете сильно свернуть (на мой взгляд).

Примеры

Если у пользователя есть открытый документ, который они редактируют, НЕ снимайте его. Пользователи будут злиться на вас, если ваше приложение удалит свою работу, не будучи сохраненной. (На самом деле у вас, вероятно, должен быть механизм аварийного сохранения, когда это произойдет)

Если ваш пользователь пишет сообщение для вашего сказочного приложения для социальных сетей, не позволяйте их работе пропадать. Сохраните его и попытайтесь восстановить его, когда они снова откроют приложение. Хотя это много работы по настройке, мне нравятся приложения, которые это делают.

Примечание

Большинство современных устройств редко заканчиваются из памяти. Система делает довольно хорошую работу по убийству приложений в фоновом режиме, чтобы освободить память для приложения, работающего на переднем плане. Вероятно, вы видели приложение "открыто" в App Switcher, когда вы открыли приложение, которое оно открыло, в исходное состояние. ОС освободила приложение в фоновом режиме, чтобы освободить память. См. State Restoration для получения информации о том, как избежать этой проблемы.

Если ваше приложение получает согласованные предупреждения о памяти, когда вы не выполняете огромную обработку, убедитесь, что вы сначала не утечка памяти. Обнаружение утечек памяти выходит за рамки этого ответа. Документы и tutorial.

Ответ 2

Когда вызывается didReceiveMemoryWarning, это означает, что ваше приложение использует слишком много памяти (сравните с памятью устройства), и вы должны release any additional memory used by your view controller уменьшить объем памяти вашего приложения. Если приложение памяти перейдет в память устройства, iOS немедленно уничтожит ваше приложение. "ресурсы, которые можно воссоздать" означает что-то, что вы можете снова воссоздать, где-то, они вам не нужны (не нужно их помещать в память). И вы можете освободить его, когда получите didReceiveMemoryWarning.

Вот еще одна подробная тема: максимальный размер бюджета ios app