Как правильно использовать метод dispose

Проблема

Реализация метода dispose может приводить к некоторым неочевидным ошибкам при его использовании.

Например, при разработке собственного компонента, который имеет три свойства, задаваемые извне:

PP.Ui.MyButton = function (settings)

{

       this._ImageList = null;

       this._Metabase = null;

       this._Source = null;

       PP.Ui.Control.call(this, settings);

};

PP.initClass(PP.Ui.MyButton, PP.Ui.Control, "Button");

 

Далее пример использования созданного компонента:

var imgList = new PP.ImageList({ Source: "Icon.png" });

var source = new PP.Exp.EaxAnalyzer();

var mb = new PP.Mb.Metabase();

var btn = new PP.Ui.MyButton({

       ImageList: imgList,

       Source: source,

       Metabase: mb

});

btn.dispose();

 

После выполнения примера и вызова метода dispose у кнопки, объектам source, imgList и mb также будет вызван метод dispose. Но так как эти свойства задаются извне и создаются вне кнопки, то это является ошибкой. Поэтому для свойств, значения которых являются ссылками на объекты типа PP.Object и задаются извне, нельзя вызывать dispose внутри класса-пользователя этих объектов.

Решение

В классе MyButton необходимо переопределить базовый метод dispose следующим образом:

PP.Ui.MyButton.prototype.dispose = function ()

{

       delete this._ImageList;

       delete this._Metabase;

       delete this._Source;

       PP.Ui.Control.dispose.apply(this, arguments);

};

Примечание. В переопределённом методе обязательно необходимо вызвать dispose базового класса.

Теперь внешним объектам метод dispose вызван не будет.

См. также:

База знаний разработчиков веб-приложений