1) var x1:X = new X();
2) var x2:X = new X();
...
3) x1.z = new SWFLoader(...);
...
4) x2.z = x1.z;
5) x1.z = null
6) x1 = null;
Последнее утверждение бесполезно, потому что утверждение 4 гарантирует, что x1 и все остальное, что оно содержит, никогда не будут собирать мусор, пока существует x2.z. Кто-нибудь еще думает, что это странно? Это было большим шоком и недостатком для меня того, что мне нужно было сделать. Есть ли обходной путь вообще?
Единственная причина, по которой это имеет смысл, заключается в том, что все в x1 хранилось в непрерывной памяти или что-то в этом роде, но когда вы говорите «x1.z = new ...» в большинстве языков, это подразумевает его запуск и выделение нового блока память в другом месте и возвращение указателя на него (указатель, который впоследствии также назначается для x2.z.) Я всегда интерпретировал «ссылку» в actionScript как «указатель».
Конечно, некоторые могут сказать, что вы все равно можете удалить все в x1 по отдельности. Но если бы не оператор 4 выше, оператор 6 пометил бы все в x1 для удаления.
(Примечание: единственная причина, по которой я поместил утверждение 5, заключается в том, чтобы сказать флеш-плееру: «Я действительно больше не интересуюсь x1.z», но это не имело значения.)