PDA

Просмотр полной версии : null VS undefined


bicubic_bublic
12.11.2009, 04:18
После нескольких тестов пришел к выводу, что
x = new TestClass();
x = null;
не инициирует удаление объекта из памяти
однако если прописать
x = undefined;
он сразу же исчезает

что вы думаете по этому поводу?

mayakwd
12.11.2009, 04:21
как вы проверили что он сразу же исчезает?

bicubic_bublic
12.11.2009, 04:24
ну во первых пропал weak EventListener
и в weakKeys Dictionary пропал ключ-объект

public class TestClick extends MovieClip
{

var t:Test;
var dict:Dictionary;

public function TestClick() {
dict = new Dictionary(true);
t = new Test();
dict[t] = true;
stage.addEventListener(MouseEvent.CLICK, t.testFunction, false, 0, true);
stage.addEventListener(MouseEvent.CLICK, onStageClick, false, 0, true);
}

private function onStageClick(e:MouseEvent) {
trace('stage click');
//t = undefined;
t = null
for (var i:Object in dict) {
trace('test ', i);
}
}

}

public class Test
{

public function Test() {

}

public function testFunction(e:MouseEvent = null) {
trace('test click');
}

}

mayakwd
12.11.2009, 04:26
из памяти он никуда не делся.

в случае с Dictionary
нужно использовать просто delete dict[key];

ключ так же исчезает как и его значение.

Добавлено через 1 минуту
undefined
trace ('start: '+System.totalMemory);
var s : Sprite = new Sprite();
addChild(s);
s.graphics.beginFill(1,1);
s.graphics.drawRect(0, 0, 100, 100);
s.graphics.endFill();
trace ('after creation: '+System.totalMemory);
s = undefined;
trace ('after deletion: '+System.totalMemory);

null
trace ('start: '+System.totalMemory);
var s : Sprite = new Sprite();
addChild(s);
s.graphics.beginFill(1,1);
s.graphics.drawRect(0, 0, 100, 100);
s.graphics.endFill();
trace ('after creation: '+System.totalMemory);
s = null;
trace ('after deletion: '+System.totalMemory);

bicubic_bublic
12.11.2009, 04:30
x = null;
вывод:
test click
stage click
test [object Test]
test click
stage click
test [object Test]

x = undefined;
вывод:
test click
stage click
test [object Test]
stage click
stage click

mayakwd
12.11.2009, 04:31
странные у вас методы проверки *почесал лоб*

bicubic_bublic
12.11.2009, 04:36
хотя для более сложных классов (таких как спрайт) ни undefined ни null значение не инициировало удаление..

расширил Test для тестирования хранения данных
public class Test
{

var testString:String;

public function Test() {
testString = "123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 1234567890123456789012345678901234567890123456789012345678901234567890";
}

public function destroy() {
testString = undefined;
}

public function testFunction(e:MouseEvent = null) {
trace('test click');
}

}

без destroy-я тоже не удаляется

mayakwd
12.11.2009, 04:40
и не будет оно инициировать ничего. даже для объекта обычного.

public class TestClass extends Sprite {
public function TestClass() {
var obj : Object = {lala: "lala"};

var dict : Dictionary = new Dictionary(true);
dict[obj] = "lalaobj";

//obj = undefined;
obj = null;

for (var nObj : * in dict) {
trace (nObj+" :: "+dict[nObj]);
}
}
}


Добавлено через 4 минуты
хотя для более сложных классов (таких как спрайт) ни undefined ни null значение не инициировало удаление..

расширил Test для тестирования хранения данных
public class Test
{

var testString:String;

public function Test() {
testString = "123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 1234567890123456789012345678901234567890123456789012345678901234567890";
}

public function destroy() {
testString = undefined;
}

public function testFunction(e:MouseEvent = null) {
trace('test click');
}

}

без destroy-я тоже не удаляется

ой йой... что ж вы делаете... testString = undefined;
блин почитайте пожалуйста про объекты про простые типы и про удаление.
всё что вы тут написали и выше и ниже полное заблуждение, не хочу вас обидеть - просто вы запутались.

объект нельзя удалить или т.п. можно ссылки на него сделать недействительными и сборщик мусора потом удалит его при следующей итерации очистки.

bicubic_bublic
12.11.2009, 04:50
почему же тогда когда я удаляю ссылку null'ом GC не собирает его, а при undefined - сразу же

wvxvw
12.11.2009, 05:06
почему же тогда когда я удаляю ссылку null'ом GC не собирает его, а при undefined - сразу же

Случайность.
Если у вас при этом останутся еще действительные ссылки, то это ваше действие на жизнь удаляемого объекта вообще ни как не повлияет.

etc
12.11.2009, 09:53
Пользуйтесь профайлером.

kackbip
12.11.2009, 11:03
Пользуйтесь профайлером.
А что это?
Посмотрел пакет flash.profiler, но там только showRedrawRegions

bicubic_bublic
12.11.2009, 11:10
Случайность.
Если у вас при этом останутся еще действительные ссылки, то это ваше действие на жизнь удаляемого объекта вообще ни как не повлияет.

эта случайность кажется мне закономерностью...

Добавлено через 2 минуты
А что это?
Посмотрел пакет flash.profiler, но там только showRedrawRegions

имелось ввиду, видимо, это (http://ru.wikipedia.org/wiki/Профилирование)

mayakwd
12.11.2009, 11:18
А что это?
Посмотрел пакет flash.profiler, но там только showRedrawRegions

посмотрите в сторону De MonsterDebugger

etc
12.11.2009, 11:50
mayakwd, дебаггер и профайлер вещи совсем разные.
Я имел ввиду профайлер в Flex/Flash Builder.

mayakwd
12.11.2009, 11:54
это не совсем дебаггер, там встроенный профайлер есть (профайлер это сборщик информации о работе приложения) . так что в сторону монстер дебаггера стоит посмотреть.

bicubic_bublic
12.11.2009, 11:55
оффтоп: чем мне не нравится DeMonsterDebugger - он налагает дополнительные условия на код..