Что будет выведено в примере №7

Все четыре выражения содержат объекты, а не nil: a и b являются сильными внешними ссылками, несмотря на weak-ссылки delegate.

Короткий ответ

Что ответить на собеседовании

Все четыре выражения содержат объекты, а не nil: a и b являются сильными внешними ссылками, несмотря на weak-ссылки delegate.

Подробный разбор

Ответ с пояснениями

Условие

В данном примере создаются два класса, каждый из которых хранит слабую (weak) ссылку на объект другого класса. После создания экземпляров и установки взаимных делегатов выводятся сами объекты и их делегаты, чтобы понять, какие значения будут напечатаны.

import Foundation

class A: NSObject {
    weak var delegate: B?
}

class B: NSObject {
    weak var delegate: A?
}

var a: A?
var b: B?

func configure() {
    a = A()
    b = B()

    a?.delegate = b
    b?.delegate = a
}

configure()

print(a)              // ?
print(b)              // ?
print(a?.delegate)    // ?
print(b?.delegate)    // ?

Ответ

Все четыре выражения содержат объекты, а не nil: a и b являются сильными внешними ссылками, несмотря на weak-ссылки delegate.

После configure глобальные optional-переменные продолжают удерживать A и B. Поэтому a?.delegate указывает на B, а b?.delegate — на A. Print для NSObject обычно показывает optional-описание класса и адрес, который заранее неизвестен. Если затем присвоить a = nil, объект A освободится и b?.delegate автоматически станет nil; B при этом останется удержан переменной b. Weak влияет только на конкретную ссылку, а не на все способы владения объектом.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее