Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 15.09.2006, 02:33
artcraft вне форума Посмотреть профиль Отправить личное сообщение для artcraft Посетить домашнюю страницу artcraft Найти все сообщения от artcraft
  № 1  
Ответить с цитированием
artcraft
 
Аватар для artcraft

блогер
Регистрация: Aug 2005
Адрес: www.artcraft.cz
Сообщений: 1,967
Записей в блоге: 6
Отправить сообщение для artcraft с помощью ICQ
По умолчанию GC не срабатывает

не удаляется экземпляр класса :~/
в чём причина?

так работает:
Код:
package {
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.TimerEvent;
	import flash.utils.Timer;

	public class Test extends Sprite {
		
		function Test():void {
			var a:Sprite = new Sprite();
			a.addEventListener(Event.ENTER_FRAME, efListner, false, 0, true);			
			addChild(a);removeChild(a);a=null;
			
			function efListner(e:Event):void {trace('Please delete me...');}
			
			forceGCRun();
		}
		
		
		private function forceGCRun():void{
			var a:Sprite;
			var count:uint;
			var oldCount:uint;
			var timer:Timer;
			
			a = new Sprite();
			a.addEventListener(Event.ENTER_FRAME, efListner, false, 0, true);			
			addChild(a);removeChild(a);a=null;
			function efListner(e:Event):void {count++;}

			timer = new Timer(1000);
			timer.addEventListener("timer", timerHandler, false, 0, true);
			timer.start();
			
			function timerHandler(e:TimerEvent):void {
				if(oldCount == count){
					 trace(':)', timer.currentCount);
					 timer.stop(); timer=null;
				}
				oldCount = count;
				for (var n:uint=0; n<10000; n++){
					a = new Sprite();	addChild(a);removeChild(a);a=null;
				}
			}
		}
				

	}
}

а так не работает:
Код:
package{	
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.TimerEvent;
	import flash.utils.Timer;
	
	public class Test extends Sprite{	
	
		function Test(){
			
			var c:c1 = new c1();
			addChild(c); removeChild(c);
			c=null;
			
			forceGCRun();
		}
		
		public function forceGCRun():void{
			var a:Sprite;
			var count:uint;
			var oldCount:uint;
			var timer:Timer;
			
			a = new Sprite();
			a.addEventListener(Event.ENTER_FRAME, efListner, false, 0, true);			
			addChild(a);removeChild(a);a=null;
			function efListner(e:Event):void {count++;}

			timer = new Timer(1000);
			timer.addEventListener("timer", timerHandler, false, 0, true);
			timer.start();
			
			function timerHandler(e:TimerEvent):void {
				if(oldCount == count){
					 trace('GC RUN :)', timer.currentCount);
					 timer.stop(); timer=null;
				}
				oldCount = count;
				for (var n:uint=0; n<10000; n++){
					a = new Sprite();	addChild(a);removeChild(a);a=null;
				}
			}
		}
	

	}
}

import flash.display.Sprite;
import flash.events.Event;

class c1 extends Sprite{
	function c1(){
		addEventListener(Event.ENTER_FRAME, function(e:Event):void{trace('c');},false,0,true);
	}
}
__________________
Хороший отдых - половина работы.

Старый 15.09.2006, 11:38
MerlinTwi вне форума Посмотреть профиль Отправить личное сообщение для MerlinTwi Посетить домашнюю страницу MerlinTwi Найти все сообщения от MerlinTwi
  № 2  
Ответить с цитированием
MerlinTwi
 
Аватар для MerlinTwi

Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
А вот так срабатывает:
Код:
class c1 extends Sprite{
	function c1(){
		addEventListener(Event.ENTER_FRAME, efListner,false,0,true);
	}
	function efListner(e:Event):void{
		trace('c');
	}
}
Наверное объявление функции в таком виде
Код:
addEventListener(Event.ENTER_FRAME, function(e:Event):void{trace('c');},...
не привязывает ее к текущему классу, а делает глобальной... и это мешает удалению объекта.
__________________
Создатель: Бойцовский клуб | TimeZero | Sky2Fly
Я возьму сам.

Старый 15.09.2006, 16:28
artcraft вне форума Посмотреть профиль Отправить личное сообщение для artcraft Посетить домашнюю страницу artcraft Найти все сообщения от artcraft
  № 3  
Ответить с цитированием
artcraft
 
Аватар для artcraft

блогер
Регистрация: Aug 2005
Адрес: www.artcraft.cz
Сообщений: 1,967
Записей в блоге: 6
Отправить сообщение для artcraft с помощью ICQ
вот блин...
cпасибо - мне такого в голову не пришло
__________________
Хороший отдых - половина работы.

Старый 15.09.2006, 17:59
artcraft вне форума Посмотреть профиль Отправить личное сообщение для artcraft Посетить домашнюю страницу artcraft Найти все сообщения от artcraft
  № 4  
Ответить с цитированием
artcraft
 
Аватар для artcraft

блогер
Регистрация: Aug 2005
Адрес: www.artcraft.cz
Сообщений: 1,967
Записей в блоге: 6
Отправить сообщение для artcraft с помощью ICQ

буду отвыкать так писать
__________________
Хороший отдых - половина работы.

Старый 29.11.2007, 20:36
Alexandor1984 вне форума Посмотреть профиль Отправить личное сообщение для Alexandor1984 Найти все сообщения от Alexandor1984
  № 5  
Ответить с цитированием
Alexandor1984

Регистрация: Nov 2006
Сообщений: 106
А у меня обькт всеравно не умер
Код:
package {
	import flash.display.MovieClip;

	public class Main extends MovieClip{

		public function Main():void {
			var temp:Mc= new Mc();
			addChild(temp);
			removeChild(temp);
			temp = null;
		}
	}
}

package {
	import flash.display.MovieClip;
	import flash.events.*;

	public class Mc extends MovieClip{

		public function Mc():void {

			addEventListener(Event.ENTER_FRAME, handler);
		}
		private function handler(event:Event):void {
			trace("а я все живу!!!")
		}
	}
}
Подскажите, пожалуйста, в чем ошибка, кроме моей головы?

Старый 29.11.2007, 20:55
artcraft вне форума Посмотреть профиль Отправить личное сообщение для artcraft Посетить домашнюю страницу artcraft Найти все сообщения от artcraft
  № 6  
Ответить с цитированием
artcraft
 
Аватар для artcraft

блогер
Регистрация: Aug 2005
Адрес: www.artcraft.cz
Сообщений: 1,967
Записей в блоге: 6
Отправить сообщение для artcraft с помощью ICQ
в AS3 нету никакой возможности стереть ненужный объект из памяти собственноручно,
он будет автоматически удалён сборщиком мусора если он посчитает что объект больше не используется.

сборка мусора это ресурсоёмкий процесс, поэтому он выполняется не постоянно, а запускается время от времени - по мере необходимости

толковая статья на эту тему:
http://www.gskinner.com/blog/archive...source_ma.html


в данном случае на объект не остаось живих ссылок и он будет удалён в следующем проходе,
и вам нужно просто перед обнуление переменной удалить ENTER_FRAME листнер

можно внутри Мс класса повесить листнер на удаление из дисплей листа и в нём удалять ENTER_FRAME
__________________
Хороший отдых - половина работы.


Последний раз редактировалось artcraft; 29.11.2007 в 21:10.
Старый 29.11.2007, 22:33
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 7  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,784
Неплохо было бы подписаться на событие со слабой ссылкой.

Либо хак:

Код:
package {
	import flash.display.MovieClip;
	import flash.events.*;
	import flash.net.LocalConnection;

	public class Main extends MovieClip{

		public function Main():void {
			var temp:Mc= new Mc();
			addChild(temp);
			removeChild(temp);
			temp = null;
			this.stage.addEventListener(MouseEvent.CLICK, function(e:Event):void{try{new LocalConnection().connect('gcForce');new LocalConnection().connect('gcForce');}catch(e:Error){}});
		}
	}
}
(кликнуть по сцене)


Последний раз редактировалось etc; 29.11.2007 в 22:40.
Старый 29.11.2007, 23:00
artcraft вне форума Посмотреть профиль Отправить личное сообщение для artcraft Посетить домашнюю страницу artcraft Найти все сообщения от artcraft
  № 8  
Ответить с цитированием
artcraft
 
Аватар для artcraft

блогер
Регистрация: Aug 2005
Адрес: www.artcraft.cz
Сообщений: 1,967
Записей в блоге: 6
Отправить сообщение для artcraft с помощью ICQ
этот хак следует использовать только для тестирования, а в конечном продукте нужно стараться перед обнулением удалять все энтерфреймы, таймеры, таймауты, и весь остальной мусор который может срабатывать и после обнуления

в данном случае, слабая ссылака тут не при чём,
ведь листнер находится внутри Mc класса
__________________
Хороший отдых - половина работы.

Старый 29.11.2007, 23:04
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 9  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,784
Да какая разница, где он находится?
Если объект-владелец больше ссылок не имеет, клип должен быть удален.

Старый 29.11.2007, 23:11
artcraft вне форума Посмотреть профиль Отправить личное сообщение для artcraft Посетить домашнюю страницу artcraft Найти все сообщения от artcraft
  № 10  
Ответить с цитированием
artcraft
 
Аватар для artcraft

блогер
Регистрация: Aug 2005
Адрес: www.artcraft.cz
Сообщений: 1,967
Записей в блоге: 6
Отправить сообщение для artcraft с помощью ICQ
та ссылка не препятствует удалению т.к. листнер находится внури обнулённого объекта, поэтому пользоваться слабой ссылкой нет никакой необходимости
__________________
Хороший отдых - половина работы.

Создать новую тему Ответ Часовой пояс GMT +4, время: 15:36.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 15:36.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.