Я пытался следить за официальными документами Swift и пробовал пройти через примеры автоматического подсчета ссылок, которые они предоставили. В своем примере они пытаются показать, как избежать цикла сильных ссылок с помощью слабых ссылок.
import UIKit
class Person {
let name: String
init(name: String) { self.name = name }
var apartment: Apartment?
deinit { print("\(name) is being deinitialized") }
}
class Apartment {
let unit: String
init(unit: String) { self.unit = unit }
weak var tenant: Person?
deinit { print("Apartment \(unit) is being deinitialized") }
}
var john: Person?
var unit4A: Apartment?
john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")
john!.apartment = unit4A
unit4A!.tenant = john
john = nil
print("Strong ref cycle")
Как описано в документе, когда мы назначаем nil ссылке на john, она должна вызывать деиницирование, так как ей больше не назначены сильные ссылки. Но когда я запускаю приведенный выше пример, он не выводит этот оператор. Не уверен, в чем проблема. Есть ли какая-то путаница в моем понимании или происходит что-то еще?
Вы запускаете этот код на игровой площадке? - Сравните stackoverflow.com/q/24363384.
Да, я запускаю это на игровой площадке
Ого, он действительно печатает. Что не так с Xcode? это ошибка?
Скопируйте и вставьте свой код в online.swiftplayground.run без небезопасного uikit импорта, и я вижу печать, что john деинициализирован.