ENIGMA AI
ENIGMA AI
iOS Сложный

Какие механизмы управления памятью существуют в iOS?

Управление памятью в iOS

1. ARC (Automatic Reference Counting)

Современный стандарт — компилятор автоматически вставляет retain/release.

class Person {
    var name: String
    init(name: String) { self.name = name }
    deinit { print("\(name) deallocated") }
}

func example() {
    let person = Person(name: "Alice")  // retain count = 1
    // Компилятор вставит release в конце scope
}  // person deallocated

2. Типы ссылок:

Strong (по умолчанию)

var strong: Person? = Person(name: "Bob")  // +1

Weak

weak var weakRef: Person?  // Не увеличивает count
// Становится nil при dealloc

Unowned

unowned var unownedRef: Person  // Не увеличивает count
// Crash при доступе после dealloc

3. Retain Cycle (циклическая ссылка):

class Person {
    var apartment: Apartment?
}

class Apartment {
    var tenant: Person?  // ПРОБЛЕМА: retain cycle
}

let john = Person()
let apt = Apartment()
john.apartment = apt
apt.tenant = john
// Никто не освободится!

// РЕШЕНИЕ:
class Apartment {
    weak var tenant: Person?  // Слабая ссылка
}

4. Closure capture:

class ViewController {
    var name = "Main"

    func setupClosure() {
        // ПРОБЛЕМА: self captured strongly
        someClosure = {
            print(self.name)
        }

        // РЕШЕНИЕ: capture list
        someClosure = { [weak self] in
            guard let self = self else { return }
            print(self.name)
        }

        // Или unowned (если уверены)
        someClosure = { [unowned self] in
            print(self.name)
        }
    }
}

5. Autorelease Pool:

autoreleasepool {
    for _ in 0..<1000000 {
        let data = Data(...)  // Временные объекты
    }
    // Память освобождается здесь
}

Инструменты отладки:

  • Instruments (Leaks) — поиск утечек
  • Memory Graph Debugger — визуализация связей
  • Xcode Memory Report — мониторинг

Похожие вопросы

Готовитесь к собеседованию?

ENIGMA AI — невидимый ИИ-помощник для технических интервью

Попробовать бесплатно
Все вопросы