Почему Swift не размещает циклические ссылки (сильные циклы ссылок) автоматически
Извините, если это глупый вопрос. Я только начал изучать Свифт. Я в основном использую php для своей повседневной работы. Учебник Apple Store Swift использует следующий пример (я изменил его в более короткую версию), чтобы продемонстрировать использование слабой ссылки:
class Person {
var apartment: Apartment?;
}
class Apartment {
weak var tenant: Person?;
}
var john: Person?; john = Person();
var number73: Apartment?; number73 = Apartment();
john!.apartment = number73; number73!.tenant = john; //circular reference here
john = nil; number73 = nil; //deference from static variable names
В приведенном выше определении класса квартиры, если слабый ключевое слово удаляется из ВАР арендатор, он создает сильный ссылочный цикл в следующем коде, так что два экземпляра не удаляются по GC. Однако мне кажется, что GC действительно не нуждается в указании слабой ссылки. Очевидно, что эти два экземпляра не могут быть связаны с любыми переменными в текущей области видимости или с любыми статическими переменными, поэтому они безопасны для удаления.
Зачем дозировать Свифт форсировать синтаксис? Единственное преимущество, которое я могу понять, - это слабое ключевое слово, выделяющее логику, поэтому код легче читать.
1 ответ:
Swift не использует сборку мусора mark-and-sweep. Он использует подсчет ссылок. При подсчете ссылок подсчитывается количество ссылок на каждый объект: каждый раз, когда создается новая ссылка на объект, количество ссылок увеличивается, и каждый раз, когда ссылка на объект удаляется, количество ссылок уменьшается. Как только объект имеет нулевые ссылки, он удаляется. Одна из главных слабостей подсчета ссылок заключается в том, что циклические структуры не утилизируются от.
В вашем примере
john
имеет ссылку наnumber73
иnumber73
имеет ссылку наjohn
. Таким образом, если ключевое словоweak
удалено, каждый объект имеет по крайней мере одну ссылку на него, и поэтому ни один из объектов не будет удален.Слабые ссылки помогают разорвать циклы. В принципе, слабые ссылки не учитываются, и таким образом объекты, которые имеют только слабые ссылки на них, будут удалены. В этом примере, поскольку экземпляр
Apartment
имеет только слабую ссылку на экземплярPerson
, последний имеет отсчет ссылок равен 0 и будет удален. После этого также экземплярApartment
имеет число ссылок 0 и также будет удален.