Очистка ArrayCollections - PullRequest
       1

Очистка ArrayCollections

0 голосов
/ 16 сентября 2011

Изначально у меня было десять наборов массивов, объявленных в модуле flex, которые, как я думал, вызывали утечку памяти. Поэтому я разделил их на один класс, который я бы очистил, используя метод «уничтожить», который я создал внутри него. Будет ли это работать?

Я ненавижу название вопроса извините. Но я бы не стал писать «Соблазнение сборщика мусора»

        [Bindable]
        public class Cfd
        {
            private static var instance:Cfd = new Cfd();
            private var _cfds:ArrayCollection = new ArrayCollection();

            // Constructor
            public function Cfd(){
                if (instance) { throw new Error('Cannot create a new instance.  Must use Cfd.getInstance().') }
            }

            public static function getInstance():Cfd{
                return instance;
            }

            public function get cfds():ArrayCollection{
                return _cfds;
            }
            public function set cfds(value:ArrayCollection):void{
                _cfds = value;
            }

            public function destroy():void{
                if(_cfds != null){
                    _cfds.removeAll();
                }
                }
}

Ответы [ 2 ]

1 голос
/ 16 сентября 2011

Всякий раз, когда вы используете такие Singletons, вы в значительной степени гарантируете утечку памяти, потому что вы, вероятно, слушаете ArrayCollection (и, возможно, элементы внутри него) повсюду.Когда вы явно предоставляете ссылку на объект через пару получатель / установщик, вы можете добавить прослушиватель в установщик и удалить его при сбросе значения.

Проверьте http://www.developria.com/2010/08/rethinking-addeventlistener-an.html, чтобы узнать большечто происходит.

Подробнее о том, почему вы должны избегать синглетонов http://misko.hevery.com/2008/08/17/singletons-are-pathological-liars

1 голос
/ 16 сентября 2011

Просто обнулить объект должен, если к нему не подключены слушатели.

cfds = null;

Я никогда не видел, чтобы [Bindable] использовался в самом классе, поэтому не уверен, что вы там пытаетесь сделать.

  package{
    public final class Cfd{
        private static var instance;

        private var _cfds:ArrayCollection = new ArrayCollection();

        public function Cfd(singletonEnforcer:MySingletonEnforcer){
            if (instance) { throw new Error('Cannot create a new instance.  Must use Cfd.getInstance().') }
        }

        public static function getInstance():Cfd{
          if (instance == null)
            instance = new MySingleton(new MySingletonEnforcer());
          return instance;
        }

        // don't see a real need for setter/getters here 
        public static function get cfds():ArrayCollection{
            return _cfds;
        }
        public static function set cfds(value:ArrayCollection):void{
            _cfds = value;
        }

        // I wouldn't even use a destroy on this class since it is a singleton.
        // just set the data to null Cfd.cfds = null
        public static function destroy():void{
            _cfds = null
        }
    }
  }

  //this is in Cfd.as but is outside the package block
  class MySingletonEnforcer {}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...