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 — невидимый ИИ-помощник для технических интервью
Попробовать бесплатно