Вот блестящие цитаты из Форумы разработчиков Apple описали вкусные детали:
unowned
vs unowned(safe)
vs unowned(unsafe)
blockquote>
unowned(safe)
- это ссылка, не относящаяся к владельцам, которая утверждает, что объект все еще жив. Это похоже на слабую необязательную ссылку, которая неявно распаковывается сx!
каждый раз, когда к ней обращаются.unowned(unsafe)
походит на__unsafe_unretained
в ARC - это не-владеющая ссылка, но нет проверки времени выполнения, что объект все еще жив при доступе, поэтому оборванные ссылки попадут в мусорную память.unowned
всегда является синонимом дляunowned(safe)
в настоящее время, но предполагается, что он будет оптимизирован дляunowned(unsafe)
в сборках-Ofast
, когда проверки времени выполнения отключены.
unowned
vsweak
blockquote>
unowned
фактически использует гораздо более простую реализацию, чемweak
. Объекты Native Swift несут два подсчета ссылок, а ссылкиunowned
нажимают недостоверный счетчик ссылок вместо значения strong . Объект деинициализируется, когда его число strong достигает нуля, но оно фактически не освобождается до тех пор, пока счетчик ссылок unowned также не достигнет нуля. Это приводит к тому, что память удерживается немного дольше, когда есть неопубликованные ссылки, но обычно это не проблема, когда используетсяunowned
, потому что связанные объекты должны иметь почти равные сроки жизни в любом случае, и это намного проще и ниже накладных расходов чем реализация на стороне стола, используемая для обнуления слабых ссылок.Обновление: в современном Swift
weak
внутренне используется тот же механизм, что иunowned
. . Таким образом, это сравнение неверно, поскольку оно сравнивает Objective-Cweak
с Swiftunonwed
.Причины
Какова цель сохранения памяти в памяти после владения ссылками достигают 0? Что произойдет, если код попытается что-то сделать с объектом, используя неопубликованную ссылку после того, как он деинициализирован?
Память сохраняется в памяти, так что ее значения сохранения остаются доступными. Таким образом, когда кто-то пытается сохранить сильную ссылку на незарегистрированный объект, среда выполнения может проверить, что сильный счетчик ссылок больше нуля, чтобы гарантировать сохранность объекта.
Что происходит с владением или отсутствием ссылки на объект? Является ли их время жизни отделенным от объекта, когда он деинициализирован или их память также сохраняется до тех пор, пока объект не будет освобожден после того, как будет освобождена последняя незанятая ссылка?
Все ресурсы, принадлежащие объекту, освобождаются как вскоре после того, как будет удалена последняя сильная ссылка объекта, и будет запущен ее запуск. Недопустимые ссылки сохраняют память только в стороне от заголовка с подсчетом ссылок, его содержимое является нежелательным.
blockquote>Возбуждено, да?