0Pricing
Swift Academy · Урок

Основы 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 — локальная установка не требуется.

Все уроки этого курса

  1. Основы ARC: strong / weak / unowned
  2. Циклы удержания и разрыв с помощью weak/unowned
  3. Типы-значения для уменьшения совместного использования
← Назад к Swift Academy