Вопрос сбора мусора - PullRequest
       14

Вопрос сбора мусора

2 голосов
/ 03 ноября 2010

Рассмотрим следующий сегмент кода:

function loadSomeContent()
{
    URLLoader loader = new URLLoader("http://www.somesite.com/");

    loader.addEventListner("onLoadComplete", loadCompleteHandler);

    loader.sendHttpRequest();
}

function loadCompleteHandler(event)
{
    log("Load response received");
}

Не беспокойтесь о синтаксисе этого кода.

Вот мое беспокойство - объект загрузчика, который используется для отправки HTTP-запроса и для которого зарегистрировано событие onLoadComplete , не ссылается извне loadSomeContent () . Есть ли вероятность, что объект загрузчика будет собран мусором и loadCompleteHandler () никогда не будет вызван?

Ответы [ 5 ]

5 голосов
/ 03 ноября 2010

Когда вы звоните loader.sendHttpRequest(), создается новый поток, который фактически отправит запрос в фоновом режиме.Этот поток сохраняет ссылку на загрузчик, чтобы он мог вызывать функцию завершения загрузки, когда загрузка завершена.В результате на загрузчик всегда будет ссылаться какой-то поток, но не тот, в котором вы сейчас находитесь.

1 голос
/ 03 ноября 2010

Нет. До тех пор, пока URLLoader содержит обратный вызов, на который все еще ссылаются (в этом случае на него все еще ссылается Javascript Engine / JVM / что угодно, потому что Engine должен вызвать его позже.

0 голосов
/ 03 ноября 2010

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

Это сломается, если вы добавите слабую ссылку:

loader.addEventListner("onLoadComplete", loadCompleteHandler, false, 0, true);

У вас могут быть проблемы с памятью, если вы не очистите свою ссылку в loadCompleteHandler;

function loadCompleteHandler(event) {
    (event.currentTarget as URLLoader).removeEventListener('onLoadComplete');
}
0 голосов
/ 03 ноября 2010

только если:

function loadCompleteHandler(e: event): void{
    (e.target as URLLoader).removeEventListner("onLoadComplete", loadCompleteHandler);
}

он должен быть собран AS3 GC (чтобы не осталось ссылок и чтобы мы не могли проверить, существует ли этот локальный var:)

0 голосов
/ 03 ноября 2010

По моему опыту, активный объект загрузчика, такой как URLLoader или Loader, не будет собран (пока он активен).

Однако, важный момент, который нельзя упускать, заключается в том, что в лучшем случае это наблюдаемое поведение, но оно не документировано как таковое (по крайней мере, насколько мне известно; я могу ошибаться).

Итак, несмотря на внутренний механизм, используемый проигрывателем для реализации этого (создает ли он новый поток, использует ли он централизованный и глобальный пул соединений и т. Д. И т. Д.), Я думаю, что вам не следует полагаться на это, потому что вы быпривязывать свой код к деталям реализации (опять же, если это поведение задокументировано, это не применимо!).

Кроме того, как я уже упоминал в комментарии, в flash.net API есть класс, FileReference, которые можно было бы собрать, если бы вы использовали их как в своем коде.

Итак, подведем итог: вы, вероятно, можете просто сохранить локальную ссылку, основанную на том, как все работает в данный момент (и на основе наблюдения!), Но это не гарантировано, так что вам лучше хранитьнелокальная ссылка, когда ваш загрузчик активен.

...