Все четыре выражения содержат объекты, а не nil: a и b являются сильными внешними ссылками, несмотря на weak-ссылки delegate.
Что будет выведено в примере №7
Все четыре выражения содержат объекты, а не 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 влияет только на конкретную ссылку, а не на все способы владения объектом.