Там нет «сильного опорного цикла» (ранее известно «сохранить цикл») здесь.Ваши weak
ссылки предотвращают это.
Невозможность увидеть свидетельство освобождения обоих объектов является , а не результатом кода в вашем вопросе.Это просто своеобразное поведение игровой площадки.
Если вы запускаете это в приложении, оно работает нормально.
И, что интересно, когда я тестировал это на игровой площадке Xcode 10.2 beta 2, он тоже там правильно себя вел.
Если оставить в стороне эту проблему, есть пара проблем сmakePartner
.Держу пари, что вам все равно, что это просто проверка слабых отношений, но если вам все равно, я бы хотел уточнить вопросы:
Что если«А» был партнером с «В», но теперь мы хотим сделать его партнером с «С».Ваш код сделает партнеров «А» и «С» друг для друга, но «Б» все еще будет болтаться там, все еще думая, что его партнеры с «А», хотя это не так.
Или что, если «C» ранее был партнером с «D», теперь, когда он был переназначен на «A», нам действительно нужно сообщить «D», что он больше не партнер с«C».
Или давайте предположим, что «A» был партнером с «B», и теперь мы хотим сказать, что у него нет партнера, то есть, что его партнером является nil
.Опять же, мы должны сообщить «B», что его партнер также nil
, а не «A».
Наконец, как вы можете видеть, этот «один человек может быть толькоПартнерские отношения с кем-то другим ». Взаимосвязанная структура является хрупкой, мы действительно хотим убедиться, что никакой внешний код не может изменить чьего-либо партнера, а может сделать это только через makePartner
.