# V3208. Unity Engine. Using 'WeakReference' with 'UnityEngine.Object' is not supported. GC will not reclaim the object's memory because it is linked to a native object.

Анализатор обнаружил использование экземпляра класса 'UnityEngine.Object' или его подкласса вместе с 'System.WeakReference'. Из-за неявного использования экземпляра самим движком поведение слабой ссылки может отличаться от ожидаемого.

Рассмотрим пример:

    WeakReference<GameObject> _goWeakRef;
    void UnityObjectWeakReference()
    {
      var go = new GameObject();
      _goWeakRef = new WeakReference<GameObject>(go);
    }

В данном примере создается слабая ссылка на объект класса 'GameObject'. Даже если вы не создавали сильных ссылок на этот объект, сборщик мусора не сможет очистить его. Свойство 'IsAlive' у 'WeakReference' или результат метода 'TryGetTarget' у 'WeakReference<T>' будут иметь значение 'true' даже после уничтожения объекта при помощи метода 'Destroy' или 'DestroyImmediate'.

Больше информации об этом можно прочитать в документации Unity.

При обнаружении подобного использования 'WeakReference' стоит произвести рефакторинг кода для исключения использования слабой ссылки вместе с 'UnityEngine.Object' или его подклассами.

Так же анализатор выдаёт предупреждение, когда при помощи метода 'WeakReference.SetTarget' в качестве аргумента передают экземпляр класса 'UnityEngine.Object' или его подкласса.

Данная диагностика классифицируется как:

CWE-686