Просмотр полной версии : Память от удалённого объекта
Доброго времени суток! Меня инетресует следующая ситуация: допустим, глобально создаётся пременная A типа MovieClip, затем ей даётся значение объекта типа, унаследованного от MovieClip:
A=new FromMovieClip()
В эту переменную A засовывается куча детей, слушателей и т.д.
Потом удаляем всех слушателей этого объекта и делаем так:
A=new FromMovieClip(), т.е. заново создаём "чистый" объект.
или вот так:
A=new FromMovieClip2(), где FromMovieClip2 - тип унаследованный от MovieClip, но другой.
Вопросы такие:
1. Оптимален ли такой метод и как сделать лучше?
2. Надо ли удалять всех детей перед присвоением нового значения?
Спасибо
caseyryan
02.11.2013, 18:22
1) Да, вполне оптимален. Ссылка на объект меняется, он больше ни к чему не привязан и сборщик мусора может его собрать.
2) Нет, не обязательно. Они будут убиты вместе с ним, при условии, что на них больше нет никаких других ссылок. Если ссылки будут, то этот объект будет жить вместе со своими детьми
Anton Riot
02.11.2013, 19:03
На операцию "new" тратится времени больше, чем на очистку всех полей объекта. Оптимальнее не заново создавать "чистый" объект, а очищать имеющийся.
Спасибо! А можно поподробней механизм этой очистки, пожалуйста? Получается, что при создании объекта заново и при простом обнулении удалёный объект одинаково просто будет ждать пока его почистят или при применении new такого не будет? Равнозначно ли количество выделяемой памяти при этих двух процессах?
caseyryan
02.11.2013, 23:25
Ioangum, механизм очистки в ФП один - это сборщик мусора (garbage collector). Он работает по принципу: если на объект нет ссылок, значит его можно удалить
Если вы создаете новый объект привязанный к уже созданной переменной, то предыдущая ссылка на другой объект, которая хранилась в этой переменной, затирается новой. Соответственно связь со старым объектом теряется. Это все равно что просто присвоить значение переменной null
На операцию "new" тратится времени больше, чем на очистку всех полей объекта. Оптимальнее не заново создавать "чистый" объект, а очищать имеющийся.
Соглашусь. Причем нужно еще учитывать то, что старый объект все равно придется зачищать, не зависимо от того, будет создаваться новый или будет использоваться он же. Иначе утечек памяти не избежать
Спасибо! А можно поподробней механизм этой очистки, пожалуйста? Получается, что при создании объекта заново и при простом обнулении удалёный объект одинаково просто будет ждать пока его почистят или при применении new такого не будет? Равнозначно ли количество выделяемой памяти при этих двух процессах?
Вы обнуляете не объект а ссылку. Переправили ссылку на null, а потом переправили на только что созданный объект или сразу переправили на только что созданный - какая разница?
caseyryan, то есть детей всё-таки надо удалять? Или в каком смысле старый объект нужно "зачищать"?
caseyryan
03.11.2013, 08:45
Они все равно будут удаляться сборщиком мусора. Просто надо подумать, что целесообразнее удалить все ненужное внутри объекта вручную, и использовать тот же объект для дальнейшей работы, вместо создания нового
Я создаю дикт и потом его зануляю в цикле по id
MikroAcse
03.11.2013, 18:56
Babylon, а есть какой-то особый смысл в занулении циклом? Чем _dict = null не угодил?
Babylon, а есть какой-то особый смысл в занулении циклом? Чем _dict = null не угодил?
как работает _dict = null?
Akopalipsis
03.11.2013, 19:07
Я создаю дикт и потом его зануляю в цикле по id
А как это Вы словарь циклом проходите? Или Вы имели ввиду, что id циклом нулюете?
dict[node]=class
dict[node]=null
caseyryan
03.11.2013, 20:15
А как это Вы словарь циклом проходите? Или Вы имели ввиду, что id циклом нулюете?
А в чем, собственно проблема?for (var key:Object in dict) trace(dict[key]);
Akopalipsis
03.11.2013, 20:15
Babylon а ведь вроде нулить элемент не нужно, достаточно только ключ удалить и элемент сам отвалится.. На него же ссылок больше нет...
MikroAcse
03.11.2013, 20:55
достаточно только ключ удалить и элемент сам отвалится.. На него же ссылок больше нет...
Но ведь это происходит не сразу.
как работает _dict = null?
Удаляет последнюю ссылку на этот словарь, что со временем удалит и сам словарь, после чего потеряются ссылки на объекты словари и удалятся.
dict может содержать id элементов разных XMLList
<views id="1">
<View id="1">
<View id="2">
.....
</View>
</View>
</views>
<classes id="1">
<Class1 id="1"><s>
1;3;4 ids видов
</s>
....
</Class1>
<Class2 id="2"><s>
1;3;4 - ids видов
</s>
....
</Class2>
</classes>
caseyryan
03.11.2013, 22:39
Но ведь это происходит не сразу.
Монопенисуально. И при назначении ссылке значения null объект тоже удалится не сразу
Dukobpa3
03.11.2013, 22:50
что со временем удалит и сам словарь, после чего потеряются ссылки на объекты словари и удалятся.
o rly?
var dict:Object = {};
var obj:SomeObject = new SomeObject();
dict["some"] = obj;
delete dict["some"];
trace(obj); // ???
dict = null;
trace(obj); // ???
alexcon314
03.11.2013, 23:12
На момент трэйсов имеем законную ссылку на SomeObject - obj. Ее то никто не занулил. Что эти трейсы должны доказать?
Akopalipsis
03.11.2013, 23:15
Стринг в качестве ключа вроде не рекомендуется.
Dukobpa3
03.11.2013, 23:21
Что эти трейсы должны доказать?
То что сам по себе словарь ничего не значит, если ссылки на каждый объект в отдельности не отслеживать.
Если словарем пользоваться так как обычно пользуюсь я - то для меня словарь это как правило дубль какой-то еще коллекции.
Одна и та же коллекция объектов может быть в виде вектора-массива, в виде словаря объектов по текстовому ключу, в виде словаря текстовых меток по ключу-объекту.
Сама коллекция места не занимает, место занимают объекты хранящиеся в ней.
Ну и это было в ответ на это:
как работает _dict = null?
Удаляет последнюю ссылку на этот словарь, что со временем удалит и сам словарь, после чего потеряются ссылки на объекты словари и удалятся.
Возможно я не правильно истолковал эту витиеватую фразу.
Akopalipsis
03.11.2013, 23:22
кто не рекомендует?
Коллегия психиатров,
Обратите внимание, что объект Dictionary никогда не удаляет «слабые» ключи String из таблицы. Особенно в случае ключей String, «слабая» ссылка никогда не удаляется из таблицы ключей и объект Dictionary будет продолжать хранить «сильную» ссылку на соответствующие значения.
alexcon314
03.11.2013, 23:54
Витиеватый пример :).
Логично предположить, что зануление ссылки на контейнер (dict) должно бы означать зануление всех ссылок внутри него как минимум. И циклом затирать не потребовалось бы. Вопрос состоит в том, как это проверить :) Или что про это пишут в доках.
А что будет реально удалено - это вопрос другой.
caseyryan
04.11.2013, 08:49
Коллегия психиатров,
Обратите внимание, что объект Dictionary никогда не удаляет «слабые» ключи String из таблицы. Особенно в случае ключей String, «слабая» ссылка никогда не удаляется из таблицы ключей и объект Dictionary будет продолжать хранить «сильную» ссылку на соответствующие значения.
Я б сказал, лучше слабые ключи не использовать
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.