Основы ARC: strong / weak / unowned
Изучите подсчёт ссылок ARC и узнайте, когда использовать strong , weak и unowned , чтобы избежать утечек памяти.
«Основы ARC: strong / weak / unowned» — бесплатный урок Swift Academy на CoddyKit. Это урок 1 из 3. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 3 уроков всего.
ARC за одну минуту
Swift использует ARC (автоматический подсчёт ссылок). Каждая сильная ссылка увеличивает счётчик экземпляра класса. Когда он опускается до нуля, выполняется deinit и память освобождается.
Сильная ссылка по умолчанию
Сильная ссылка используется по умолчанию. Когда исчезает последняя сильная ссылка, вызывается deinit.
final class Person {
let name: String
init(_ name: String) { self.name = name; print("init:", name) }
deinit { print("deinit:", name) }
}
var p: Person? = Person("Ada")
p = nil // ARC count -> 0, triggers deinitПример цикла
Двунаправленные сильные ссылки создают цикл удержания. ARC не может освободить такие объекты, что приводит к утечке.
final class A {
var b: B?
deinit { print("A deinit") }
}
final class B {
var a: A?
deinit { print("B deinit") }
}
var a: A? = A()
var b: B? = B()
a?.b = b // strong
b?.a = a // strong
a = nil // no deinit (cycle)
b = nil // still no deinit (leak)Слабая ссылка
Сделайте одну сторону слабой, чтобы избежать цикла. Слабые ссылки являются необязательными и автоматически получают значение nil, когда объект освобождается.
final class A2 {
weak var b: B2? // weak breaks the strong cycle
deinit { print("A2 deinit") }
}
final class B2 {
var a: A2?
deinit { print("B2 deinit") }
}
var a2: A2? = A2()
var b2: B2? = B2()
a2?.b = b2 // weak
b2?.a = a2 // strong
a2 = nil // A2 deinit runs
b2 = nil // B2 deinit runsСсылка без владения
Используйте ссылку без владения, когда объект, на который она указывает, переживёт эту ссылку. Такая ссылка необязательна и не получает значение nil; обращение к ней после освобождения объекта приводит к сбою, поэтому гарантируйте время жизни объектов.
final class Customer {
let name: String
var card: CreditCard?
init(_ name: String) { self.name = name }
deinit { print("Customer deinit") }
}
final class CreditCard {
unowned let owner: Customer // never optional; owner must outlive card
init(owner: Customer) { self.owner = owner }
deinit { print("CreditCard deinit") }
}
var cust: Customer? = Customer("Lars")
cust!.card = CreditCard(owner: cust!)
cust = nil // deallocates both (no cycle)Советы и шаблоны
Советы:
- По умолчанию используйте сильные ссылки.
- Разрывайте циклы с помощью слабых ссылок (ссылки делегатов обычно делают слабыми).
- Используйте ссылки без владения только при гарантированном времени жизни (например, ребёнок → родитель).
- Классы являются ссылочными типами; структурам и перечислениям не нужны правила ARC.
Слабая ссылка или ссылка без владения?
Быстрая проверка: когда выбирать слабую ссылку, а когда ссылку без владения?
Повторение
Повторение: ARC освобождает объекты, когда не остаётся сильных ссылок. Предотвращайте циклы с помощью слабых ссылок (необязательных) или ссылок без владения (с гарантированным временем жизни). Выбирайте минимально необходимое безопасное владение.
Часто задаваемые вопросы
Урок «Основы ARC: strong / weak / unowned» бесплатный?
Да — полный текст урока «Основы ARC: strong / weak / unowned» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 3 уроков всего.
Чему я научусь в уроке «Основы ARC: strong / weak / unowned»?
Изучите подсчёт ссылок ARC и узнайте, когда использовать strong , weak и unowned , чтобы избежать утечек памяти. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Swift Academy?
Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 3.
Сколько времени занимает урок «Основы ARC: strong / weak / unowned»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Swift Academy?
Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Основы ARC: strong / weak / unowned
- Циклы удержания и разрыв с помощью weak/unowned
- Типы-значения для уменьшения совместного использования