Olá, Visitante. Por favor Entre ou Registe-se se ainda não for membro.
4 de Dezembro de 2008, 18:43:38
Início Ajuda Pesquisa Entrar Registe-se
Notícias: Já somos mais de 600 MEMBROS!


+  Redcodestudio
|-+  Flash Flex RIA Communities
| |-+  Flash Developer
| | |-+  Garbage Collection
« anterior seguinte »
Páginas: [1] Ir para o fundo Imprimir
Autor Tópico: Garbage Collection  (Lida 2280 vezes)
yarcub
Aprendiz
**
Offline Offline

Mensagens: 138


Ver Perfil
« em: 4 de Maio de 2007, 22:13:14 »

Oi, malta.

Esta semana fiz a minha primeira tentativa no padrão de desenho MVC.
No fla "em branco" funcionava bem, com uma implementação do género:
Código:
import flash.geom.Point;

var point:Point = new Point(0,0);
var myGallery:as.Gallery = new as.Gallery(this, point, "data.xml");
myGallery.drawGFX();


O problema surgiu quando tentei implementar num projecto.
Tenho na library vários movieclips, cada um corresponde a uma secção.
E tenho um movieclip único no stage para onde vou fazendo o attachMovie de cada secção. Uma da secções tem a galeria implementada da maneira que mostrei em cima.
O código para mudar de secção simplificando é:
Código:
_contentHolder.removeMovieClip();
_contentHolder = _ref.attachMovie(...);


Só que de cada vez que volto à secção da galeria algumas das instâncias dentro do movieclip ñ foram destruídas, continua a ter uma instancia da galeria. E tds essas instâncias continuam a "apanhar" os eventos disparados aquando das mudanças no modelo/lógica.

Do que googlei e li por alto fiquei com a ideia que uma determinada instância apenas é apagada quando não existir nenhuma referência que aponte para ela.
Por isso tive que fazer um método na classe principal que me apagasse essas referências antes de remover o movieclip.
Código:
_contentHolder.myGallery.destroy();
_contentHolder.removeMovieClip();
_contentHolder = _ref.attachMovie(...);


Se alguém souber um método estruturado de ir apagando as pegadas era óptimo.  Tongue

Deixo aqui uns links do que fui apanhando à medida que procurava.
-Definição de Garbage Collection
-Garbage Collection no Flash 8.
-Understanding garbage collection in Flash Player 9
-Resource management strategies in Flash Player 9
-Garbage Collector Simulator

Desculpem o testamento, mas gostava de compreender isto.  :?
Registado
yarcub
Aprendiz
**
Offline Offline

Mensagens: 138


Ver Perfil
« Responder #1 em: 6 de Maio de 2007, 14:31:48 »

Pois, assim sem código é complicado explicar melhor o que está a acontecer.
Deixo aqui em anexo um rar com os ficheiros.

Para conseguírem compilar o fla precisam de ter o Fuse Kit e a classe Proxy.

Se alguém quiser perder uns minutos de fds, 'tá à vontade. Smiley


Edit:Dava jeito o link. Cheesy Aqui está ele. LINK
Registado
alftuga
Aprendiz
**
Offline Offline

Mensagens: 202


Ver Perfil WWW
« Responder #2 em: 7 de Maio de 2007, 10:43:27 »

no teu mvc criastes listeners certo?

e seguramente que não apagas esse listeners dai não conseguires apagar tudo.

yarcub não sei se te lembras mas falando sobre essa matéria eu disse te varias vezes de criares sempre methodos para apagar eses listeners que estão a ouvir o teu modelo antes de destruir o teu objecto. tens que implementar um methodo em todas view e controlers que tem listeners.

espero não ter respondido ao lado da pergunta
Registado
yarcub
Aprendiz
**
Offline Offline

Mensagens: 138


Ver Perfil
« Responder #3 em: 7 de Maio de 2007, 14:37:48 »

Oi, quando comecei a ter problemas a primeira coisa que me lembrei foi do que disseste.  Smiley

Criei um método destroy() para remover os listeners(é a parte que está comentada no código), apesar de ficar bem nesses eventos à mais qq coisa que ñ está bem pq aquilo engata tudo.

Aquilo foi feito um pouco em cima do joelho por isso acho que a melhor coisa a fazer é começar de novo. Cheesy
Registado
alftuga
Aprendiz
**
Offline Offline

Mensagens: 202


Ver Perfil WWW
« Responder #4 em: 7 de Maio de 2007, 19:38:19 »

yello Smiley

Olha não ando mesmo com muito tempo para analisar o teu prob (sorry) mas vou te dizer algumas coisas que me parecem importantes.

1/
eventos no flash
http://www.gskinner.com/blog/archives/000027.html
class GDispatcher = Potente!!!

2/
No teu modelo mvc assim por alto é o teu "modelo" que faz o registo dos listeners eu não faço assim para min o "modelo" lança um grito e depois só quem quer esse grito é que o trata o seja eu faço o registo do listener na minha "view".

E é ai que tb elimino o listener neste momento tas a quebrar o modelo MVC (acho eu) do facto da view comunicar directamente com o modelo.

Atenção existe uma coisa parecida que é o patern "observer" não  confundir.

3/ o controlador normalmente ouve a view não é a view a executar methodos do "controler".

4/ o "modelo" pode perfeitamente inicializar a tua view isso quer dizer que podes tb guardar uma referencia das varias views que crias no teu modelo  
(pode dar jeito). Criaste uma class Galery onde inicias os objectos não é preciso se queres criar uma class Galery seria uma interface a definir.

5/ Ok, vamos então destruir o objecto no modelo MVC.
O "modelo" lança um grito a dizer assim "destrói a galeriaA" todas as view estão a ouvir, se uma delas detecta que tem esse nome destrói os seus listeners todos, lança um ultimo grito o "controlador"  o controlador destrói
o seu listener que ouve a view e informa pela ultima vez o "modelo" que a view esta preparada para ser destruida por completo. Ai o "modelo" da mesma maneira que cria a view destrói a view (ex:unloadMovie).
E vais me dizer mas o controlador ainda existe!

Nops o controlador é criado na view!

É uma referencia privada da view o modelo nunca sabe nada do controlador nem comunica com ele.

E como o modelo destroi a view após o delete dos listeners, o controlador é eliminado com a view.

Não desistas do mvc. Ele é mesmo o teu amigo Smiley


ps: tens um methodo na tua class "modelo" que se chama refresh numa analise superficial parece-me que ela reorganiza o array certo? se é o caso não a nenhuma razão ela estar dentro do modelo pois é só uma questão de organizar dados (apresentação) é na view que precisas de por esse methodo.

Bem que português tão péssimo espero que entendestes o que quis dizer!
(se alguém me quer corrigir que seja no português ou na parte técnica eu não levo nada a mal até agradeço).
Registado
yarcub
Aprendiz
**
Offline Offline

Mensagens: 138


Ver Perfil
« Responder #5 em: 12 de Maio de 2007, 10:11:53 »

Obg pelas dicas, consegui por isto a funcionar. :wink:
Era mesmo remover os Listeners na sequência correcta que estava a empancar isto td.

Por enquanto isto ainda é um assunto um pouco confuso para mim, ter começado por uma Compound Pattern(MVC) tb ñ deve ter sido a melhor ideia.  Smiley

A implementação que fiz ñ me parece que esteja grande coisa, principalmente na View mas deixo aqui o código para quem quiser experimentar.

Entretando vou ver se continuo a ler o "OO Actionscript for Flash 8" e se deito uma vista de olhos no livro da Head First.
Registado
Páginas: [1] Ir para o topo Imprimir 
« anterior seguinte »
Ir para:  


Entrar com nome de utilizador, password e duração da sessão


Powered by MySQL Powered by PHP Powered by SMF 1.1.4 | SMF © 2006-2007, Simple Machines LLC
Seo4Smf v0.2 © Webmaster's Talks
XHTML 1.0 válido! CSS válido!
Página criada em 0.059 segundos com 19 procedimentos.