PDA

Просмотр полной версии : Удаление объекта класса


Juice_Green
30.05.2006, 12:37
Всем привет!

есть следующий класс:

class WNotify extends MovieClip{
private var w_clip:MovieClip; // ссылка на клип
// конструктор
function WNotify(PARENT:MovieClip) {
PARENT.attachMovie("WNotify", "WNotify", PARENT.getNextHighestDepth());
w_clip = PARENT["WNotify"];
_x = 400;
_y = 200;
}

public function deleteObject() {
w_clip.removeMovieClip();
delete this;
}
}


создаю объект в главном фрейме

var mynotify:WNotify = new WNotify(_root);


А теперь собственно вопрос:
надо удалить объект mynotify
1 вариант) пишу
delete mynotify;

Результат: сам объект удаляется, а мувик который аттачится в конструкторе - остается

2 вариант) пишу
mynotify.deleteObject();

Результат: объект не удаляется, а удаляется только мувик созданный

Кто что подскажет, ? мож я где нить ошибку допустил

Nirth
30.05.2006, 13:34
либо
public function deleteObject() {
this.removeMovieClip();
delete this;
}

либо
вместо
delete mynotify;
пишем
myntify.removeMovieClip();

Juice_Green
30.05.2006, 14:09
Nirth, первое "либо" удаляет только мувик, а созданный объект остается. А второй либо так и не понял, - предлагаешь удалять мувик, а объект оставлять в памяти ?

Nirth
30.05.2006, 14:12
не в первом delete тоже можно снести, я его просто забыл удалить.

createEmptyMovieClip("mc",1);
mc.prop = "a";
trace(mc);
trace(mc.prop);
mc.removeMovieClip();
trace(mc);
trace(mc.prop);

как видишь ремувМувиклип сносит подчистую=)

Nirth
30.05.2006, 14:14
Вообще мувиклипы в ActionScript особые объекты их нельзя создавать через конструкторы(ну можно, но эфекта ты не получишь) и нельзя удалть через delete (вернее через delete ты можешь удалить ссылку на мувик, но мувик будет жить и радоватся)

Juice_Green
30.05.2006, 14:15
у тебя немножко подругому сделано. Ты мувику назначаешь свойство, а я не объекту класса, в этом же объекте еще и ссылка на мувик

Nirth
30.05.2006, 14:16
я сделал пример где показываеться что сноситься и мувик и ссылки в нем
твой Класс наследник MovieClip - class WNotify extends MovieClip{
тоесть к нему применимо все что применимо к MovieClip

toFlash
30.05.2006, 14:20
у меня тоже не получилось удалять таким образом как ты говоришь Nirth.
полностью удалить объект выходит тока так:
mynotify.deleteObject()
delete mynotify;

Juice_Green
30.05.2006, 14:26
to Nirth:
то что наследник никто не спорит,
использовал для того - чтобы оперировать со свойствами _x, _y и др. объекта мувиклип ...
а понятие деструктора в AS случаем нет ?

Nirth
30.05.2006, 14:54
2 toFlash
а ты меня правильно понял? я говорю что нужно юзать removeMovieClip()

2Juice_Green
увы нету, приходиться писать свой и в ручную вызывать.

toFlash
30.05.2006, 15:40
2 toFlash
а ты меня правильно понял? я говорю что нужно юзать removeMovieClip()


myntify.removeMovieClip();
никакого результата не дает
клип не удаляется, объект тоже, может поподробней примерчик ...

7thsky™
30.05.2006, 15:41
Не надо нам дестракторов

Обычные Объекты удаляются только GarbageCollector
delete удаляет только ссылку

MovieClip & TextField особые объекты
они создаются только через методы
createEmpytMovieClip, attachMovie, createTextField, removeTextField, removeMovieClip

class SomeMovie extends MovieClip {

public static var linkageID:String = 'someMovie';
public static var initialized:Boolean = Object.registerClass (linkageID, SomeMovie);


public static function create ( parent:MovieClip,
instanceName:String,
instanceDepth:Number ):SomeMovie {

return SomeMovie (parent.attachMovie (linkageID, instanceName, instanceDepth));
}

/**
* при таком создании нету надобности в
* public static var linkageID:String = 'someMovie';
* public static var initialized:Boolean = Object.registerClass (linkageID, SomeMovie);
*/
public static function create1 ( parent:MovieClip,
instanceName:String,
instanceDepth:Number,
arg:Array ):SomeMovie {

var mc:MovieClip = parent.attachMovie (linkageID, instanceName, instanceDepth);
if (mc == undefined) {
return null;
} // end if

mc.__proto__ = SomeMovie.prototype;
mc.constructor = SomeMovie;
mc.constructor.apply (mc, arg);

return SomeMovie (mc);
}

public static function create2 ( parent:MovieClip,
instanceName:String,
instanceDepth:Number,
arg:Array ):SomeMovie {

var mc:MovieClip = parent.createEmptyMovieClip (instanceName, instanceDepth);
if (mc == undefined) {
return null;
} // end if

mc.__proto__ = SomeMovie.prototype;
mc.constructor = SomeMovie;
mc.constructor.apply (mc, arg);

return SomeMovie (mc);
}

public function SomeMovie () {
trace ('isMovieClip: ' + (_totalframes >= 1));

var e:Number = arguments.length;
for (var i:Number = 0; i < e; i++) {
trace (i + ' >> ' + arguments [i]);
} // end for
}

}

var a:SomeMovie = SomeMovie.create (this, 'test1', 1);

var b:SomeMovie = SomeMovie.create1 (this, 'test2', 2);
b._x = 150;
b._y = 150;

var c:SomeMovie = SomeMovie.create2 (this, 'test3', 3, [1, 2, 'asdasdas']);