Встречается на 45% собеседований по Mobile

Расскажи про жизненный цикл объекта

Жизненный цикл объекта — это период от его создания до уничтожения, включающий инициализацию, использование и деинициализацию. В Swift управление этим циклом автоматизировано с помощью подсчёта ссылок (ARC), что требует понимания сильных и слабых ссылок для предотвращения утечек памяти.

Как это работает

В объектно-ориентированных языках, таких как Swift, каждый объект проходит несколько стадий:

  1. Инициализация: вызывается инициализатор (init), который устанавливает начальные значения всех свойств. Объект становится доступным для использования.
  2. Использование: в течение жизни объекта вызываются его методы, читаются и изменяются свойства. Это активная фаза, когда объект выполняет свою функцию.
  3. Деинициализация: перед освобождением памяти вызывается деинициализатор (deinit), если он определён. Он позволяет освободить ресурсы, такие как файловые дескрипторы или сетевые соединения.
  4. Освобождение памяти: когда счётчик ссылок на объект становится нулевым, ARC автоматически освобождает память.

Пример

Рассмотрим простой класс в Swift:

swift
class Person {
    var name: String
    
    init(name: String) {
        self.name = name
        print("\(name) создан")
    }
    
    deinit {
        print("\(name) уничтожен")
    }
}

var person: Person? = Person(name: "Alice") // создание
person = nil // счётчик ссылок становится 0, вызывается deinit, память освобождается

Здесь deinit вызывается автоматически, когда объект больше не нужен. Это позволяет отслеживать жизненный цикл и выполнять очистку.

Подводные камни

Основная проблема — утечки памяти из-за циклических ссылок. Если два объекта сильно ссылаются друг на друга, их счётчики ссылок никогда не станут нулевыми, и ARC не сможет их освободить. Например:

swift
class A {
    var b: B?
}

class B {
    var a: A?
}

var a: A? = A()
var b: B? = B()
a?.b = b
b?.a = a
// Теперь a и b ссылаются друг на друга, и даже если внешние ссылки обнулить, они не освободятся

Для решения этой проблемы используются слабые (weak) или бесхозные (unowned) ссылки. Слабая ссылка не увеличивает счётчик ссылок, поэтому цикл разрывается.

Когда использовать

Понимание жизненного цикла необходимо при работе с ресурсами, которые нужно явно освобождать (например, файлы, сокеты), а также при проектировании архитектуры приложения, чтобы избежать утечек. Особенно важно это в замыканиях, которые могут захватывать объекты, создавая циклы.

Коротко

  • Жизненный цикл: инициализация → использование → деинициализация → освобождение памяти.
  • ARC автоматически управляет памятью, но требует осторожности с циклическими ссылками.
  • Используйте weak или unowned для разрыва циклов.
  • Деинициализатор deinit — место для очистки ресурсов.
как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы