Оглавление

Управление объектами

В AngelScript хендл - указатель с механизмом подсчета ссчлок на обьект. В скриптах они используются для предачи обьектов по ссылке.
Рекомендуется:
Хендл объекта

Управление подсчетом ссылок в функциях

Когда хендл передается по значение из приложения в скрипт, или наоборот, передача учитывается счетчиком ссылок. Поэтому приложение обязано увеличивать\уменьшать счетчик ссылок лдя всех передаваемых обьектов.

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

// Зарегистрировано как "obj@ CreateObject()"
obj *CreateObject()
{
  // Конструктор инициалицирует счетчик ссылок значением 1
  return new obj();
}

Функция, получающая хендл из скрипта и сохраняющая его в глобальной переменной выглядит так:

// Зарегистрировано как "void StoreObject(obj@)"
obj *o = 0;
void StoreObject(obj *newO)
{
  // удаляет указатель на старый объект
  if( o ) o->Release();

  // создает указатель на новый
  o = newO;
}

Функция, получающая заранее сохраненный обьект выглядит так:

// Зарегистрирована как "obj@ RetrieveObject()"
obj *RetrieveObject()
{
  // Увеличиваем счетчик ссылок для возвращаемого обьекта
  if( o ) o->AddRef();

  // Возвращаем null если хендл не валидный
  return o;
}

Функция, получающая хендл в качестве параметра, но не сохраняющая его выглядит следующим образом:

// Зарегистрирована как "void DoSomething(obj@)"
void DoSomething(obj *o)
{
  // Когда закончим, обьет необходимо удалить
  if( o ) o->Release();
}

Автохендлы

Приложение может использовать автохендлы (@+) для облегчения работы с счетчиком ссылок. Когда регистрируете функцию или метод просто добавьте плюс для автоматическим управлением счетчиком. Для параметров движок будет удалять ссылку после возврата функции, и увеличивать для возвращаемых значений.
//  Зарегистрирована как "obj@+ ChooseObj(obj@+, obj@+)"
obj *ChooseObj(obj *a, obj *b)
{
  // С автохендлами AngelScript автоматически управляет счетчиком ссылок
  return some_condition ? a : b;
}

Однако, при использовании автохендлов движку необходимо обработать все хендлы, что влечет за собой больше ресурсов при вызове зарегистрированной функции.


Перевод - arroy.one@gmail.com. При копировании материалов указывайте ссылку на источник.