Когда система iOS очищает память?

Ответ

Память в iOS очищается автоматически в двух основных сценариях:

  1. При нехватке памяти (Low Memory)
  2. Когда приложение переходит в фоновый режим

Механизм очистки:

  • 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, чтобы не висеть в воздухе, умная система!

И главное, запомни нахуй: если твоё свёрнутое приложение в фоне будет вести себя как слон в посудной лавке и жрать память, как не в себя, система посмотрит на это безобразие и просто прибьёт твой процесс. Без предупреждения, без шума. Просто — пиздец, и всё. Так что в фоне надо вести себя тихо, как мышь, блядь.