0Pricing
Swift Academy · Урок

Ссылки weak и unowned

Выбирайте между weak (Optional) и unowned (не Optional), чтобы разрывать циклы.

«Ссылки weak и unowned» — бесплатный урок Swift Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.

Добро пожаловать

Для разрыва циклов удержания нужны ссылки, которые не увеличивают счетчик ARC. Swift предоставляет два варианта: `weak` (опциональная, автоматически обнуляемая) и `unowned` (неопциональная, небезопасная, если ссылка указывает на nil).

Слабые ссылки

```swift class Owner { var pet: Pet? } class Pet { weak var owner: Owner? } // does not retain var o: Owner? = Owner() var p: Pet? = Pet() o?.pet = p p?.owner = o o = nil // Owner deinit — p.owner becomes nil automatically ```

Слабые ссылки всегда опциональны

```swift class View { weak var delegate: ViewDelegate? } ``` `weak` должно быть объявлено как `var` и быть опциональным — Swift автоматически обнуляет его, когда объект, на который оно ссылается, освобождается.

Ссылки без владельца

```swift class Customer { var card: CreditCard? } class CreditCard { unowned let customer: Customer // card always has a customer init(customer: Customer) { self.customer = customer } } ``` `unowned` не удерживает объект и является неопциональной ссылкой — вы гарантируете, что объект, на который она ссылается, будет жить дольше текущего объекта.

Выбор между слабыми ссылками и ссылками без владельца

| Сценарий | Использовать | |---|---| | Объект, на который ссылаются, может стать недоступным | `weak` | | Объект, на который ссылаются, всегда живет дольше текущего | `unowned` | | Не уверены | `weak` (безопаснее) |

Доступ к ссылке без владельца после освобождения

```swift var customer: Customer? = Customer() var card = CreditCard(customer: customer!) customer = nil print(card.customer.name) // 💥 crash — unowned is dangling ``` Никогда не обращайтесь к `unowned` после освобождения объекта, на который ссылается эта ссылка.

[weak self] в замыканиях

```swift class VC { func load() { api.fetch { [weak self] data in guard let self else { return } self.render(data) } } } ``` `[weak self]` — наиболее распространенный способ исправить цикл удержания в Swift.

[unowned self] в замыканиях

```swift class Session { var onComplete: (() -> Void)? init() { onComplete = { [unowned self] in // self always outlives closure self.finish() } } } ``` Используйте `[unowned self]` только если уверены, что `self` не будет равен nil в момент выполнения замыкания.

Автоматическое обнуление наблюдаемой ссылки

```swift class Timer { weak var delegate: TimerDelegate? } var d: TimerDelegate? = ConcreteDelegate() let t = Timer() t.delegate = d d = nil print(t.delegate) // nil — automatically zeroed ```

Наилучшая практика для шаблона делегата

Всегда объявляйте свойства делегата как `weak`: ```swift protocol MyDelegate: AnyObject { func didUpdate() } class MyView { weak var delegate: MyDelegate? } ``` Ограничение `AnyObject` необходимо, чтобы использовать `weak` с протоколами.

Быстрая проверка

Какой тип ссылки автоматически устанавливается в `nil`, когда объект, на который она ссылается, освобождается?

Итоги

Основные выводы: • `weak` — опциональная, автоматически обнуляемая и безопасная ссылка • `unowned` — неопциональная ссылка, объект живет дольше текущего; при нарушении этого условия происходит сбой • В шаблонах делегатов всегда используйте `weak var delegate: Protocol?` с ограничением `AnyObject` • В замыканиях стандартный шаблон — `[weak self]`; внутри используйте `guard let self` • Если сомневаетесь, выбирайте `weak`, а не `unowned` Далее: списки захвата замыканий.

Часто задаваемые вопросы

Урок «Ссылки weak и unowned» бесплатный?

Да — полный текст урока «Ссылки weak и unowned» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.

Чему я научусь в уроке «Ссылки weak и unowned»?

Выбирайте между weak (Optional) и unowned (не Optional), чтобы разрывать циклы. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Swift Academy?

Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Ссылки weak и unowned»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Swift Academy?

Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

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

  1. Как ARC подсчитывает ссылки
  2. Циклы удержания: причины и обнаружение
  3. Ссылки weak и unowned
  4. Списки захвата замыканий и [weak self]
← Назад к Swift Academy