PDA

Просмотр полной версии : Как правильно удалить Object?


CJIECAPb
12.06.2012, 19:05
var abc:Object = {}
abc.a = "a";
abc.b = "b";
abc.c = "c";
// Удаляем так ?
abc.a = null;
abc.b = null;
abc.c = null;
abc = null;
// Или достаточно просто abc = null чтоб GC его посекал ? :)

КорДум
12.06.2012, 19:09
abc = null;
И все.

CJIECAPb
12.06.2012, 19:11
Спасибо !

gloomyBrain
12.06.2012, 22:54
Стоит, наверное, добавить, что приравнивание к null саму ссылку не "убивает". То есть после:

var abc:Object = {}
abc.a = "a";
abc.a = null;

Свойство a все еще существует. Чтобы удалить свойство объекта, нужно воспользоваться таким приемом:

delete abc["a"]

Вот после этого у объекта abc свойства "a" больше не будет.

i.o.
12.06.2012, 23:13
var abc:Object = {}
abc.a = "a";
abc.b = "b";
abc.c = "c";
// Удаляем так ?
abc.a = null;
abc.b = null;
abc.c = null;
abc = null;
// Или достаточно просто abc = null чтоб GC его посекал ? :)

В вашем случае вообще ничего удалять не нужно. Даже abc = null; не нужен. Данный объект прекрасно подберется сборщиком мусора.

samana
13.06.2012, 00:30
В вашем случае вообще ничего удалять не нужно. Даже abc = null; не нужен. Данный объект прекрасно подберется сборщиком мусора.
i.o. Скажите, а почему сборщик мусора удалит этот объект, даже если не присваивать ему значение null? Ведь объект существует. Да, пусть он пустой, но он есть и ссылка на него сохранена. Ведь вдруг мне этот объект понадобится позже, а мусоросборщик удалит его почему-то...

gloomyBrain
13.06.2012, 01:38
Отвечу за уважаемого i.o.
Приведенный выше код вероятнее всего написан в теле функции.
В приведенном коде ссылка на объект нигде не сохраняется.
Соответственно, объект "живет" только во время выполнения неизвестной нам функции.
А это, в свою очередь, означает что объект так и не будет сохранен в куче и умрет по завершении работы со стеком.
То есть GC может даже ничего не узнать об этом объекте, он сам по себе "умрет" по завершении работы функции, потому как ссылок на этот объект ни у кого нет.

samana
13.06.2012, 01:55
Конечно, если этот объект создан в теле функции, то он удалиться, это логично и никаких вопросов не вызывает. Но просто в примере выше не было сказано или показано, что этот объект создаётся в функции, по этому и озадачился вопросом, почему сборщик мусора удалит этот объект.

i.o.
13.06.2012, 07:06
i.o. Скажите, а почему сборщик мусора удалит этот объект, даже если не присваивать ему значение null? Ведь объект существует. Да, пусть он пустой, но он есть и ссылка на него сохранена. Ведь вдруг мне этот объект понадобится позже, а мусоросборщик удалит его почему-то...
gloomyBrain хорошо ответил :)
1. Почему не надо занулять и удалять внутренние поля в данном случае? Да потому что в них нет ссылок на сложные объекты, и самое главное, нет кольцевых ссылок, которые могут стать причиной утечки памяти.
2. Даже просто занулять объект далеко не всегда нужно, т.к. GC сам прекрасно определяет, когда объект становится ненужным. Другое дело, когда вы точно уверены, что данную ссылку нужно удалить, то тут да - зануляйте:)