Ответ
Память в iOS очищается автоматически в двух основных сценариях:
- При нехватке памяти (Low Memory)
- Когда приложение переходит в фоновый режим
Механизм очистки:
- ARC (Automatic Reference Counting) автоматически освобождает память объекта, когда его счётчик сильных ссылок достигает нуля.
- Система отправляет уведомление
UIApplication.didReceiveMemoryWarningNotification, на которое приложение должно реагировать, освобождая кэши и пересоздаваемые ресурсы. - UIKit автоматически очищает некоторые системные кэши (например, изображений) при получении memory warning.
Пример с weak reference:
class ExampleClass {
let id: String
init(id: String) { self.id = id; print("(id) создан") }
deinit { print("(id) уничтожен") }
}
var strongReference: ExampleClass? = ExampleClass(id: "Объект А")
weak var weakReference = strongReference // Создана слабая ссылка
strongReference = nil // Сильная ссылка обнулена
// Консоль: "Объект А создан"
// Консоль: "Объект А уничтожен" (ARC освобождает память)
// weakReference теперь автоматически становится nil
Важно: Если приложение в фоне потребляет слишком много памяти, система может завершить его процесс.
Ответ 18+ 🔞
А, слушай, про память в iOS — это вообще отдельная песня, блядь! Тут система такая хитрая жопа, она сама всё подчищает, как дворник после парада, но только в двух главных случаях, ёпта:
Первое — когда память уже на исходе, вот прям вот пиздец как мало. Система такая: "Ой, всё, ребята, я щас лопну!". Это называется Low Memory, состояние, блядь.
Второе — когда твоё приложение сворачивается и уходит в фон. Тут система сразу включает режим "А нехуй тут балласт таскать!", и начинает выкидывать всё, что плохо лежит.
А как оно чистится-то, спросишь? Ну, во-первых, есть такая штука — ARC (Automatic Reference Counting). Это он, сука, главный мусорщик. Сидит, считает ссылки на каждый объект. Как только счётчик сильных ссылок падает до нуля — тут же объекту пизда, память освобождается. Красота, блядь!
Во-вторых, система не дура, она тебе вежливо стучится: "Э, дружок-пирожок, память кончается, подвинься!". Это уведомление UIApplication.didReceiveMemoryWarningNotification. И тут уж твоя задача — срочно выкинуть из кэшей всё, что не жалко, и что можно потом заново нахуярить. Не отреагируешь — сам виноват.
Ну и UIKit сам по себе не лыком шит. Получив такой сигнал, он начинает чистить свои системные закрома: картинки там, вьюхи ненужные — короче, всё, что можно безболезненно пересоздать.
Смотри, как weak reference работает, это вообще магия, блядь:
class ExampleClass {
let id: String
init(id: String) { self.id = id; print("(id) создан") }
deinit { print("(id) уничтожен") }
}
var strongReference: ExampleClass? = ExampleClass(id: "Объект А")
weak var weakReference = strongReference // Создана слабая ссылка, она не держит объект!
strongReference = nil // Сильная ссылка обнулена — и всё, приплыли!
// Консоль: "Объект А создан"
// Консоль: "Объект А уничтожен" (ARC видит ноль сильных ссылок и сразу мочит объект)
// weakReference теперь автоматически становится nil, чтобы не висеть в воздухе, умная система!
И главное, запомни нахуй: если твоё свёрнутое приложение в фоне будет вести себя как слон в посудной лавке и жрать память, как не в себя, система посмотрит на это безобразие и просто прибьёт твой процесс. Без предупреждения, без шума. Просто — пиздец, и всё. Так что в фоне надо вести себя тихо, как мышь, блядь.