Почему 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 7

1 ответ:

Swift не использует сборку мусора mark-and-sweep. Он использует подсчет ссылок. При подсчете ссылок подсчитывается количество ссылок на каждый объект: каждый раз, когда создается новая ссылка на объект, количество ссылок увеличивается, и каждый раз, когда ссылка на объект удаляется, количество ссылок уменьшается. Как только объект имеет нулевые ссылки, он удаляется. Одна из главных слабостей подсчета ссылок заключается в том, что циклические структуры не утилизируются от.

В вашем примере john имеет ссылку на number73 и number73 имеет ссылку на john. Таким образом, если ключевое слово weak удалено, каждый объект имеет по крайней мере одну ссылку на него, и поэтому ни один из объектов не будет удален.

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