Метод delete
выполняется в области действия экземпляра, удаляемого из структуры @@instances
, поэтому он не может быть собран сборщиком мусора. Что-то вызвало запуск этого метода, и что-то в данный момент содержит ссылку на него, поэтому его нельзя собирать до тех пор, пока метод не будет возвращен (и ссылка на объект не будет очищена).
При этом вторая строка совершенно не нужна. Даже если одна из переменных экземпляра указывает на сам объект, GC достаточно умен, чтобы понять это (или, скорее, он просто игнорирует это, так как это не коллектор подсчета ссылок ).
Не пытайтесь вручную управлять памятью, она не окупится. Независимо от того, очищаете ли вы ссылки на объекты в этих переменных экземпляра, GC решает, когда они будут освобождены. Если я правильно истолковываю идею вашего примера кода, все ссылки на хост-объект очищаются после выполнения delete
, и в этом случае не имеет значения, очищаются ли его переменные экземпляра, объекты будут иметь такое же право на сборка мусора в любом случае. Объекты помечаются GC, когда они больше недоступны, не имеет значения, имеют ли ссылки на них другие недоступные объекты.