Ну вот я на скорую руку сделал отладочные сообщения по аналогии с теми, что в топике, и как-то не до конца разобрался, что и в какой момент происходит (видимо, надо побольше поэкспериментировать). Получилось так, что какя-то часть объектов удаляется уже после shutdown, а если после unset() вызавть gc_collect_cycles(), то удаляются все сразу. И вот я не понял, то ли gc_collect_cycles() вызывает и обычный сборщик мусора тоже, то ли все же считает эти ссылки циклическими.
В объекте C, кстати, тоже есть ссылка на B (об этом я уже не стал упоминать). А нужно это по двум причинам: первая, это (по аналогии опять же с jQuery), чтоб можно было вернуться к предыдущему состоянию цепочки, например:
А подскажите, пож-та (обращаюсь к автору топика, или кому-нибудь хорошо разбирающемуся в предмете), как будет происходить освобождение ресурсов в след. ситуации.
У меня есть некий класс, который представляет из себя цепочку (наподобии jQuery), т.е. в резльтате вызова одного из методов возвращается новый объект этого же класса, который имеет ссылку на тот объект, что его породил. Допустим у нас есть следующий код:
в первой строке создается объект A, после вызова method1() возвращается объект B, хранящий ссылку на A, на объекте B вызывается method2(), который возвращает объект C.
Так вот вопрос в том, происходит ли после удаления объекта C, удаление всех предыдущих объектов по цепочке в обратную сторону, или с этим также есть трудности? И, если есть, то как можно их обойти?
Так это и работает прямо в HTML и CSS, без всяких плагинов. Только в новых браузерах. А для старых небольшие костыли, так было, так будет. Впрочем конкретно для этого примера два лишних скриптика включить совсем несложно.
хм, немного пристальней вгляделся в код. Что вы имеете ввиду под «классами»? В любом случае, внутри функции init() у Вас объявляются переменные start, game, ai, player, ball без ключевого слова var. JavaScript, когда встречает такие объявления, делает такие переменные глобальными (если точнее — свойствами объекта window), поэтому все и работает. Но это очень плохой стиль, т.к. мало того, что засоряется глобальное пространство имен, так еще и понять, где что было объявлено потом очень трудно.
Да, да, я понимаю, что это простенький пример и тут и так все понятно, просто советую Вам в более серъезных задачах так не делать.
И, кстати, даже в Вашем примере, уж если без глобальных переменных было не обойтись, то правильно бы было вверху скрипта сделать объявление:
Если интересно, то вот jQuery-плагин по мотивам моей статьи, использующий FormData там, где это возможно, и позволяющий управлять очередью загрузок. В самом файле есть описание его использования. Ссылку на работающий пример и кое-какие подробности можно увидеть в UPD той самой статьи.
Теперь там, где это возможно (Safari, Chrome, FF 4+) используется FormData, что позволяет избежать загрузки файлов в память (само собой, если есть цель сэкономить память, не стоит их открывать файлы, чтоб делать превьюшки).
Если интересно, см. апдейт статьи.
Я пошел по этому же пути и добавил в свой код использование FormData там, где это возможно. Получилось, наверное, почти как у вас. Тока я еще в jQuery-плагин все это завернул.
А в остальном вроде ничего:
Зато можно визуально легко различать, двойное двоеточие было бы хуже.
а вторая, это то, что резульат вызова некоторых методов должен зависеть от того, что было в предыдущем по цепочке объекте.
У меня есть некий класс, который представляет из себя цепочку (наподобии jQuery), т.е. в резльтате вызова одного из методов возвращается новый объект этого же класса, который имеет ссылку на тот объект, что его породил. Допустим у нас есть следующий код:
в первой строке создается объект A, после вызова method1() возвращается объект B, хранящий ссылку на A, на объекте B вызывается method2(), который возвращает объект C.
Так вот вопрос в том, происходит ли после удаления объекта C, удаление всех предыдущих объектов по цепочке в обратную сторону, или с этим также есть трудности? И, если есть, то как можно их обойти?
Спасибо.
init()
у Вас объявляются переменныеstart, game, ai, player, ball
без ключевого слова var. JavaScript, когда встречает такие объявления, делает такие переменные глобальными (если точнее — свойствами объекта window), поэтому все и работает. Но это очень плохой стиль, т.к. мало того, что засоряется глобальное пространство имен, так еще и понять, где что было объявлено потом очень трудно.Да, да, я понимаю, что это простенький пример и тут и так все понятно, просто советую Вам в более серъезных задачах так не делать.
И, кстати, даже в Вашем примере, уж если без глобальных переменных было не обойтись, то правильно бы было вверху скрипта сделать объявление:
var start, game, ai, player, ball;
Если интересно, то вот jQuery-плагин по мотивам моей статьи, использующий FormData там, где это возможно, и позволяющий управлять очередью загрузок. В самом файле есть описание его использования. Ссылку на работающий пример и кое-какие подробности можно увидеть в UPD той самой статьи.
Если интересно, см. апдейт статьи.