Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как вытащить ссылку ? (http://www.flasher.ru/forum/showthread.php?t=214223)

Egstond 12.05.2017 16:45

Как вытащить ссылку ?
 
Всем доброго времени суток!
Вкратце ситуация такая, есть класс - библиотека(условно), есть класс которому нужно получить из библиотеки ссылку на звук(Sound) чтобы у себя его проиграть.

Сейчас я делаю это так,
Код AS1/AS2:

//Это класс библиотеки
var SOURСE_MUSIC:Vector.<Sound>(10);
 
public function get_mus(N:int,S:Vector.<Sound>):void
{
S.push(SOURСE_MUSIC[N]);
}
//----

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

Меня смущает то что если не использовать вектор, а просто передавать Sound и приравнивать его "=" к исходным данным, то он тупо не достается, достается только вектор и только в который записали командой push, почему так ?

Ниже приведен не рабочий вариант
Код AS1/AS2:

public function get_mus(N:int,S:Sound):void
{
S=SOURСE_MUSIC[N];
}

Такой Sound S на другом конце просто null

faraday 12.05.2017 16:58

зачем второй вектор? зачем первый? почему забор по индексу? откуда в векторе звуки?
совершенно не понятно зачем выбран такой извращенный способ. если передаете вместо вектора sound то он внутри функции и не будет присвоен.
задача функции возвращать этот звук, это она делать и должна.
Код AS3:

var cache:Object={}; 
public function get_mus(id:String):Sound{
return cache[id]||(cache[id]=new getDifinitionByName(id))
}


Egstond 12.05.2017 17:02

Цитата:

зачем второй вектор?
без вектора S не могу никак по другому вытащить ссылку.
Цитата:

зачем первый?
Звуки в библиотеке хранятся в векторе, это просто стоит воспринять как данное. Они точно верно загружены, вопрос только с вытаскиванием ссылки.
Цитата:

зачем забор по индексу?
достать нужно 1 ссылку, поэтому и индекс
Цитата:

откуда в векторе звуки?
Я просто опустил эту часть кода когда в вектор заливаются звуки, так как с этой частью проблем нет, проблема - вытащить 1 из звуков и передать дальше, причем оптимально, без загрузки памяти

Добавлено через 19 минут

Код AS1/AS2:

var cache:Object={}; 
public function get_mus(id:String):Sound{
return cache[id]||(cache[id]=new getDifinitionByName(id))

Что-то мне подсказывает что каждый раз пересоздавать объект оператором new и через функцию возвращать весь, это как минимум не более оптимально чем написал я. У меня хотя бы getDifinitionByName для 1 элемента используется 1 раз при загрузке, тут каждый раз при обращении..
Других варианты есть у кого нибудь ?

Добавлено через 58 минут
Еще раз сформулирую проблему. Объект звука нужно создать 1 раз, а дальше только распоряжаться ссылками на него.
Вот такой вариант прокатит ? функция будет возвращать лишь ссылку, или где то по ходу ее выполнения все равно будет происходить копирование самих данных звука ?
Код AS1/AS2:

public function get_mus(N:int):Sound
{
return(SOURСE_MUSIC[N]);
}


faraday 12.05.2017 18:19

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

Egstond 12.05.2017 18:30

Цитата:

в моем варианте звук создается только один раз, а потом возвращает его. смысл вообще этой функции? почему просто не обращаться к индексу вектора если знаете что точно лежит звук?
Тут библиотека одна, а кому из нее данные нужны - много. При чем данные бывают одни и те же, но нужны они разным классам программы.

Функция с возвращаемым типом Sound будет ссылку возвращать, или копию объекта ?

ZackMercury 12.05.2017 18:35

Код AS3:

public function get_mus(N:int):Sound
{
return(SOURСE_MUSIC[N]);
}

Так придётся сразу инициализировать при загрузке все звуки
Код AS3:

var cache:Object={}; 
public function get_mus(id:String):Sound{
return cache[id]||(cache[id]=new getDifinitionByName(id))
}

Так они будут создаваться при вызове.
В AS3 нет оператора копирования для классов. Они всегда передаются только по ссылке. Исключением являются только примитивные типы данных.

Egstond 12.05.2017 18:52

ок, всем спасибо

caseyryan 12.05.2017 20:16

Цитата:

Сообщение от ZackMercury (Сообщение 1200601)
Код AS3:

var cache:Object={}; 
public function get_mus(id:String):Sound{
return cache[id]||(cache[id]=new getDifinitionByName(id))
}

Так они будут создаваться при вызове.

Функция называется getDefinitionByName(). При этом id должен в точности соответствовать названию класса звука. Так, в качестве дополнения


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

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