2012-06-23 2 views
0

Я использую AS3 и FlashDevelop, и я не могу убедить мой FlashPlayer/AVM в GC его.AS3, FlashDevelop: Логические. Как вы их GC?

Я попытался довольно стандартные варианты:

myboolean = null; 
delete(myboolean); 

Но нуль он говорит: «Col: нуль используется там, где, как ожидается, логическое значение: 14 Предупреждение.» И удалить «get» col: 11 Error: Попытка удалить фиксированное свойство allDone. Только удаленные динамические свойства могут быть удалены ».

И это рассматривает булеву является definited в методе, как например:

var myBoolean:Boolean = false; 

Я понимаю, что, так как это в методе, когда таковой запустить это Конечно, она должна получить мусора, но мне нравится быть уверенным, и почему я не могу GC Boolean, когда я сделал то же самое для int, Array и Point в другом методе того же класса? Не является ли Boolean также объектом?

Так что если кто-нибудь знает, как GC Boolean, пожалуйста, дайте мне знать.

ответ

2

В принципе, как и Джонатан Хедборг, здесь вы прямо не контролируете, что такое сборщик мусора.

Я полагаю, что вы находитесь на фоне c/C++ или тому подобное, где вы ответственны за сохранение памяти более строго и напрямую, это не совсем так в AS3 и Java; хотя управление памятью по-прежнему очень важно, он обрабатывается больше на уровне объекта. Хотя Логические простирается от Object прочитать здесь относительно примитивных типов:

Null data type The Null data type contains only one value, null . This is the default value for the String data type and all classes that define complex data types, including the Object class. None of the other primitive data types, such as Boolean, Number, int and uint, contain the value null . Flash Player and Adobe AIR will convert the value null to the appropriate default value if you attempt to assign null to variables of type Boolean, Number, int, or uint. You cannot use this data type as a type annotation.

http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7f88.html#WS5b3ccc516d4fbf351e63e3d118a9b90204-7f82

В обеих случаях у вас есть такие механизмы, как ссылки обнуления для вылетали объекты из графика всех активных объектов означает, что они» Будет сбор мусора на следующем запланированном запуске сборщика мусора (который может быть принудительно, но на самом деле это не рекомендуется, конфигурация для JVM или AVM в этом случае будет обрабатывать его на основе системы, в которой она выполняется/выполняется).

обнуление объекта позволит собирать мусор, но на самом деле вы не должны беспокоиться об индивидуальных примитивных свойствах. Там есть хорошая статья, объясняющая некоторые подробности о сборке мусора в AS3 здесь (я бы оставил реферат, но вся страница довольно хороша, основные моменты я полагаю, что сбор мусора не обязательно на 100% прямолинейный, но с некоторыми усилиями можно управляемый): http://tomgabob.blogspot.com/2009/11/as3-memory-management.html

в принципе так оно и работает является FlashPlayer или любой другой виртуальной машиной вашего байт-код) (имеет граф всех объектов, которые были созданы и что имеется текущая ссылка.

У этого также есть предел памяти, который он может использовать на основе среды (config и т. Д.), Поэтому GC имеет алгоритмы настройки, чтобы выяснить, когда он должен попытаться собрать мусор. Вы должны в первую очередь относиться к обнулению ссылок на объекты, которые вам больше не нужны, и на самом деле это не слишком большая сделка, если ваше приложение не является достаточно сложным, или ваше оборудование не является чрезвычайно ограничительным в отношении ОЗУ.

Поэтому беспокойство не должно приводить к тому, что GC работает слишком мало или слишком много, но создает ссылки, которые никогда не удаляются (добавлениеListeners и не удаление из объектов, которые необходимо собрать, или просто ссылки на них внутри коллекций и т. Д. после того, как они больше не нужны). Вновь вышеизложенная статья объясняет это немного более подробно.

+0

Lol удивительно, может быть, shaun AS3 - это мое первое правильное кодирование, и я думаю, мой фон. Я просто беспокоюсь, что все вары внесут GC вне необходимости и вызывают постоянные GC-прогоны, вместо того, чтобы просто обнулить их. Я проверил некоторые статьи как здесь, так и в другом месте, и я не собираюсь заставлять GC, но надеялся, что кто-то где-то знает, как вы можете GC Booleans, потому что никто не кажется! – ReaperOscuro

+0

, отвечая на это в редактировании за секунду. – shaunhusain

+0

Абсолютно не нужно беспокоиться о одном булевом, если вы создаете тысячу таких объектов, вы должны просто беспокоиться об управлении большим количеством более крупных классов, а не беспокоиться о примитивах – shaunhusain

0

Где вы используете булевский язык? Единственный способ убедиться, что примитивы GC'ed - это обеспечить, чтобы класс, в котором он используется, собран.

+0

Это общедоступный метод унаследованного класса. Извините, позвольте мне указать что-то в главном вопросе ... – ReaperOscuro

0

Есть 2 ошибки в ваших рассуждениях:

  • «удалить» может быть применен только к динамическим объектам, а не членам класса или локальным переменным; в этих случаях просто установите член/переменную в null,
  • типы значений (логические, числовые, строковые) не обязательно должны быть GC'd; в некоторых случаях Flash создаст временные «бокс-объекты», которые будут автоматически собраны, поэтому вам не придется беспокоиться об этом.
Смежные вопросы