![]() |
|
||||||||||
|
|||||
|
Регистрация: Apr 2008
Сообщений: 11
|
Всем привет!
Не для кого не секрет что обьекты во Flex передаются в методы по ссылке на адрес в памяти. Но я был удивлен когда проделал следующее: 1. я создаю обьект, например var obj:Object = new Object(); также я написал метод примерно следующего содержания: function updateObj(obj:Object) { obj = new Object(); } например до вызова метода у обьекта obj адрес в памяти 55555555. Затем я вызываю метод updateObj и передаю туда свой обьект, внутри метода obj начинает ссылаться на другой, толькочто созданный обьект в памяти, например его адрес 333333333. НО, по выходу из метода, obj продолжает ссылаться на 55555555! Может ктонибудь прояснить это явление? И как сделать, чтобы этого не происходило??? |
|
|||||
|
Регистрация: Sep 2007
Адрес: Путенбург
Сообщений: 147
|
Вы наверно путаете адрес объекта с адресом переменной которая хранит адрес объекта? obj это же не есть объект, это есть переменная и адрес у нее свой а объект как таковой будет new Object() и при каждом вызове будет создаваться новый объект с новым адресом, а адрес переменной obj создается когда вы объявляете var obj и что бы вы туда не присвоили адрес переменной obj останется прежним.
__________________
<!-- КРЭКС ПЭКС ФЛЭКС --> |
|
|||||
|
Регистрация: Apr 2008
Сообщений: 11
|
Возможно я некорректно сформулировал вопрос, приведу небольшой пример:
public class ObjTest
{
private var obj1:Object = new Object();
public function test():void {
var obj2:Object = new Object();
trace(obj2); //b1
updateReference(obj2);
trace(obj2);//b4
}
private function updateReference(obj2:Object):void {
trace(obj1);//b2
obj2 = obj1;
trace(obj2);//b3
}
}
//b1 - obj2=@d01e6f1 //b2 - obj1=@d01e741 //b3 - obj2=@d01e741 //b4 - obj2=@d01e6f1 - почему тут снова @d01e6f1? |
|
|||||
|
Регистрация: Sep 2007
Адрес: Путенбург
Сообщений: 147
|
Потому что это параметр, он опеделяется в скобках при вызове метода:
именно для того, чтобы внутри тела метода мы бы могли его прочитать. Поэтому оно опять тут снова. Но откройте секрет, для чего же может понадобиться внесение таких недоразумений, как написали вы: private function updateReference(obj2:Object):void {
trace(obj1);//b2
obj2 = obj1;
trace(obj2);//b3
}
Это что, давняя привычка Штирлица уничтожать за собой все следы, от которой он не мог избавиться, и которая его постоянно я ставила его на грань провала? ![]()
__________________
<!-- КРЭКС ПЭКС ФЛЭКС --> |
|
|||||
|
Регистрация: Apr 2008
Сообщений: 11
|
я всеголиш хочу, чтобы мой obj2 начал ссылаться на obj1. Я могу сделать это например вот-так:
public class ObjTest
{
private var obj1:Object = new Object();
public function test():void {
var obj2:Object = new Object();
obj2 = obj1;
}
}
Также прилогаю рисунок, который пояснит что я хочу сделать. |
|
|||||
|
Регистрация: Sep 2007
Адрес: Путенбург
Сообщений: 147
|
Цитата:
__________________
<!-- КРЭКС ПЭКС ФЛЭКС --> |
|
|||||
|
Регистрация: Apr 2008
Сообщений: 11
|
Замечательно, уже ближе к истине.
я модифицирую пример: Теперь рисунок отображает то, что я хочу сделать. Я хочу чтобы obj2 и obj1 ссылались на одну ячейку в памяти. |
|
|||||
|
Регистрация: Sep 2007
Адрес: Путенбург
Сообщений: 147
|
У вас obj2 живет только внутри метода test, если вы хотите, чтобы он был доступен в обоих методах, надо сделать его свойством, таким же как obj1
__________________
<!-- КРЭКС ПЭКС ФЛЭКС --> |
|
|||||
|
Регистрация: Apr 2008
Сообщений: 11
|
Ок! я усовершенствовал свой пример, чтобы показать ради чего все это делается:
public class ObjTest
{
private var obj1:Object = new Object();
private var obj2:Object = new Object();
private var array:ArrayCollection = new ArrayCollection();
public function ObjTest() {
for (var i:Number = 0; i < 5; i ++) {
array.addItem(new Object());
}
}
public function test():void {
updateReference(obj2);
for each (var o:Object in array) {
updateReference(o);
}
}
private function updateReference(obj:Object):void {
//тут у меня реализована сложная логика нахождения обьекта на который я хочу ссылаться
//и мне нехотелось бы дублировать ее в коде, поэтому я вынес ее в отдельный метод.
obj = obj1;
}
}
|
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Пример с обычным массивом:
Вы передаете ссылку в свою функцию, в функции это уже новая локальная переменная, потом изменяете значение локальной переменной функции на новое. Но эта локальная переменная никакого отношения к массиву не имеет, разве изначально ссылается на некий объект, находящийся в неизвестном массиве. Если очень хочется, можете написать так (опять же, если array — Array обычный): |
![]() |
![]() |
Часовой пояс GMT +4, время: 02:00. |
|
|
« Предыдущая тема | Следующая тема » |
|
|