Объясните механизм: почему Swift не разрешает объявлять weak-ссылку на значение-тип?
weak применима к экземплярам классов и class-bound протоколам, потому что она отслеживает время жизни ссылочного объекта и автоматически становится nil после его уничтожения. Значение-типы не имеют отдельного управляемого ARC-объекта с общей идентичностью, поэтому обнулять такую ссылку нечему.
Optional не меняет категорию типа: опциональный Int, String или пользовательский struct остаётся значением, а не слабой ссылкой.
ARC решает задачу автоматического управления временем жизни ссылочных объектов: сильные ссылки владеют объектом, а слабые позволяют ссылаться на него без продления его жизни. Для корректной работы weak среда выполнения должна знать, какой объект уничтожен, и обнулить все зарегистрированные слабые ссылки.
Значение-типы используют другую модель. Они копируются как значения, а их время жизни связано с содержащим их хранилищем, областью действия или владельцем. Им не требуется отдельный механизм общего счётчика ссылок и автоматического обнуления псевдоссылок.
Попытка применить weak к структуре, перечислению или базовому значению приводит к ошибке компиляции. Нельзя получить слабую ссылку на значение, добавив к нему Optional: опциональность означает наличие или отсутствие значения, но не владение и не наблюдение за уничтожением объекта.
Если выбрать неверную модель, можно ожидать автоматического обнуления копии или освобождения ресурса при исчезновении исходной переменной. Для значений это неверно: копия существует независимо, а содержащиеся внутри неё сильные ссылки на классы управляются отдельно.
ARC учитывает жизненный цикл экземпляров классов. Сильная ссылка увеличивает их количество владельцев, а уничтожение последнего владельца делает объект доступным для освобождения. weak не владеет объектом и поддерживает специальную связь, которую runtime может обнулить при уничтожении объекта.
У значения нет такой общей объектной идентичности, на которую могла бы указывать weak-ссылка. Структура может быть скопирована, перемещена или встроена в другой объект, поэтому понятие «обнулить ссылку на уничтоженное исходное значение» не соответствует её семантике.
При этом значение-тип может содержать свойство ссылочного типа. В таком случае ARC управляет не самой структурой, а классом внутри неё. Копирование структуры копирует это свойство и обычно создаёт ещё одну сильную ссылку на тот же экземпляр класса.
Если нужно выразить необязательное значение, используйте Optional. Если требуется совместно наблюдаемая идентичность и слабые ссылки, представьте сущность классом. Если класс-обёртка введён только ради владения, это добавляет косвенное обращение и усложняет модель, поэтому его стоит применять лишь при реальной необходимости.
В приложении есть результат анализа изображения как структура. Компонент кэширования хочет хранить его «слабо», чтобы результат исчезал автоматически после удаления владельца.
Возможны такие варианты:
weak, но добавляет ссылочную семантику, синхронизацию доступа и косвенность;Если результат действительно является самостоятельной сущностью, которую несколько компонентов должны наблюдать и не владеть ею, разумен класс или обёртка. Если это просто данные кэша, лучше хранить их напрямую с явной политикой вытеснения: попытка имитировать weak для значения обычно маскирует неверную модель владения.
Нет. Optional хранит либо значение, либо nil, но не отслеживает внешний жизненный цикл. Если значение скопировано в несколько мест, изменение или исчезновение одной переменной не обнулит остальные копии.
ARC будет управлять экземпляром класса, находящимся в этом свойстве. Копирование структуры создаёт копию свойства-ссылки, поэтому экземпляр класса обычно получает дополнительного сильного владельца. Это не делает саму структуру ARC-объектом и не позволяет объявить слабую ссылку на её значение.
Нет. weak не является механизмом уменьшения размера или стоимости копирования значения. Для больших данных применяют подходящие структуры хранения, copy-on-write, идентификаторы или явный кэш; класс-обёртку выбирают только тогда, когда нужна общая идентичность и управляемое ссылочное владение.