Как я могу получить “ячейку памяти” экземпляра в ActionScript?

Используя lastest стандарт походит на хорошую практику, но просто имейте в виду, что WS2007HttpBinding только поддерживается клиентами, которые выполняют, по крайней мере, версии среды выполнения.NET 3,5 SP1 или 3,0 SP1.

32
задан Laurel 24 April 2018 в 05:07
поделиться

3 ответа

На самом деле я советую вам не использовать это слишком часто... это очень дорого. Adobe нужно создать родную функцию для возврата этого нам.

Но пока что... попробуйте вот это:

Вам придется вызвать явное принуждение, чтобы получить это! Потому что при явном принуждении вы получите ошибку вроде этой:

TypeError: Error #1034: 
Type Coercion failed: cannot convert Main@1c49d31 to flash.utils.ByteArray.

Обратите внимание, что в этой ошибке вы получите то, что хотели... @1c49d31. Этот хэш - как идентификатор при распределении памяти.

Я провел много тестов. Этот хэш просто меняется, когда вы вызываете "new" (в языках C это эквивалентно [[... alloc] init]), а для статических функций и статических свойств выделение происходит немного иначе... в любом случае....

Возвращаясь к Flash, проблема в том, что у нас нет прямого способа получить этот хэш без ошибки.

Но это не очень большая проблема. Все, что вам нужно, это использовать некоторые "try" и "catch". Вот так:

try
{
    ByteArray(anyObjectToKnowItAllocationHash);
}
catch (e:Error)
{
    trace(e);
}

И вуаля! Вы получите хэш без ошибки! После этого я сделал более утонченный способ... Попробуйте вот так:

var memoryHash:String;

try
{
    FakeClass(anyObjectToKnowItAllocationHash);
}
catch (e:Error)
{
    memoryHash = String(e).replace(/.*([@|\$].*?) to .*$/gi, '$1');
}

internal final class FakeClass { }

Немного пояснений по этому поводу: fakeClass нужен для того, чтобы убедиться, что это приведет к ошибке. Регулярное выражение - чтобы перехватить последние @..., которые появляются. Потому что объекты и функции выдают разные сообщения об этой ошибке. А $ - для отлова статических объектов, классов и функций, потому что у них нет "@" в хэше памяти и разные зоны в памяти.

Этот маленький код работает для меня просто замечательно! Теперь я могу закончить некоторые замечательные движки, которые я делаю, которые работают с управлением памятью, слабыми ссылками и ID на основе памяти.

Надеюсь, это поможет вам.

Пока, и удачи, мой друг!

59
ответ дан 27 November 2019 в 20:07
поделиться

Off the top of my head the only way I can see to pull this off would be to use a Dictionary object (you'd probably want to enable weak keys to avoid any side effects) and then just take the objects as you create them and use them as a key to an incrementing ID counter. Then you could simply look to see if two objects existed as a keys in the Dictionary and if so compare the values stored there.

6
ответ дан 27 November 2019 в 20:07
поделиться

Насколько мне известно, нет способа получить значение, которое отладчик показывает вам во время выполнения.

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

1
ответ дан 27 November 2019 в 20:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: