UObjectBase

Класс **UObjectBase** находится в самой вершине иерархии классов UE4: от него порождён класс UObjectBaseUtility, а через последний — класс UObject, который «официально» считается базовым классом всех объектов.

UObjectBase отвечает за добавление объектов к массиву объектов (на котором основана работа сборщика мусора) и в хэш-таблицу имён (используется для поиска объекта по имени). Здесь же определены методы и поля, связанные со сбором статистики и с регистрацией классов.

## Конструкторы

```
protected UObjectBase()

```

Конструктор, не выполняющий никаких действий.

```
protected UObjectBase(
              EObjectFlags  InFlags)

```

Параметры:

* InFlags — флаги создаваемого объекта.

Этот конструктор инициализирует следующие поля:

* ObjectFlags получает значение параметра InFlags;
* InternalIndex получает значение INDEX\_NONE (-1);
* Class получает значение NULL;
* Outer получает значение NULL.

```
public UObjectBase(
           UClass       *InClass,
           EObjectFlags  InFlags,
           UObject      *InOuter,
           FName         InName)

```

Параметры:

* InClass — класс, к которому относится создаваемый объект; не может быть нулём.
* InFlags — флаги создаваемого объекта.
* InOuter — объект-«хозяин» создаваемого объекта (создаваемый объект логически находится внутри «хозяина»).
* InName — имя создаваемого объекта.

Значения параметров присваиваются соответствующим полям создаваемого объекта. Если создание выполняется не в основном потоке игры, будет принудительно установлен флаг RF\_Async. После заполнения полей новый объект добавляется к массиву объектов, а его имя — к хэш-таблице имён. Последние действия технически выполняются методом AddObject.

## Деструкторы

```
public virtual  ~UObjectBase()

```

Конечный деструктор, удаляющий объект из массива объектов и (косвенно) из любых аннотаций.

## Методы

### AddObject

```
private void  AddObject(
                  FName  Name)

```

Параметры:

* Name — имя, присваиваемое объекту.

Этот метод добавляет новосозданный объект к массиву объектов и хэш-таблице имён, предварительно присвоив полю Name значение, заданное в качестве параметра. Кроме того, если вызов метода произведён не из главного потока игры, для объекта устанавливается флаг RF\_Async.

Для добавления объекта к массиву вызывается функция AllocateUObjectIndexForCurrentThread, а к хэш-таблице имён — фукнция HashObject.

### AtomicallyClearFlags

```
public void  AtomicallyClearFlags(
                 EObjectFlags  FlagsToAdd)

```

Атомарно сбрасывает заданные флаги в поле ObjectFlags.

### AtomicallySetFlags

```
public void  AtomicallySetFlags(
                 EObjectFlags  FlagsToAdd)

```

Атомарно устанавливает заданные флаги в поле ObjectFlags.

### CreateStatID

```
private void  CreateStatID() const

```

!TODO!

### DeferredRegister

```
protected virtual void  DeferredRegister(
                            UClass  *UClassStaticClass,
                            const TCHAR *PackageName,
                            const TCHAR *Name)

```

Превращает зарегистрированный во время запуска движка класс в обычный, добавляет объект в массив объектов и в хэш-таблицу имён и т.д.

!TODO!

### EmitBaseReferences

```
public static void  EmitBaseReferences(
                        UClass *RootClass)

```

Выдаёт токен для сборщика мусора.

!TODO!

### GetClass

```
public UClass *GetClass() const

```

Возвращает значение поля Class.

### GetFlags

```
public EObjectFlags  GetFlags() const

```

Возвращает значение поля ObjectFlags.

### GetFName

```
public const FName  GetFName() const

```

Возвращает значение поля Name.

### GetOuter

```
public UClass *GetOuter() const

```

Возвращает значение поля Outer.

### GetStatID

```
public TStatId  GetStatID(
                        bool  bForDeferredUse = false
                    ) const

```

!TODO!

### GetUniqueID

```
public uint32  GetUniqueID() const

```

Возвращает значение поля InternalIndex. Хотя этот идентификатор назван уникальным, он является таковым только на время жизни объекта; после его уничтожения этот же идентификатор может быть присвоен новому объекту.

### IsValidLowLevel

```
public bool  IsValidLowLevel() const

```

Этот метод проверяет допустимость объекта. Возвращается false при обнаружении какой-либо проблемы и true в случае, если всё в порядке. Выполняются следующие проверки:

* наличие самого объекта (this отличен от нуля);
* назначенность класса (поле Class отлично от нуля);
* допустимость индекса объекта в массиве объектов (для проверки вызывается метод FUObjectArray::IsValid).

### IsValidLowLevelFast

```
public bool  IsValidLowLevelFast(
                 bool  bRecursive = true
             ) const

```

Параметры:

* bRecursive — если равен true, выполняется проверка корректности класса, заданного полем Class данного объекта.

В случае, если ошибок не выявлено, возвращается значение true, в противном случае — false.

Этот метод выполняет большее число проверок, чем метод IsValidLowLevel.

!TODO!

### LowLevelRename

```
protected void  LowLevelRename(
                    FName    NewName,
                    UObject *NewOuter = NULL

```

Параметры:

* NewName — новое имя объекта.
* NewOuter — новый «хозяин» объекта. Если задан нуль, «хозяин» не изменяется.

Этот метод меняет имя и, возможно, «хозяина» данного объекта, а также вносит необходимые изменения в хэш-таблицу имён. Сбор статистики для объекта в связи с его переименованием начинается заново.

Для выполнения операций с хэш-таблицей имён вызываются функции UnhashObject и HashObject.

### Register

```
protected void  Register(
                    const TCHAR *PackageName,
                    const TCHAR *Name)

```

Ставит в очередь запрос на регистрацию данного объекта.

!TODO!

### RegisterDependencies

```
protected virtual void  RegisterDependencies()

```

Этот метод заставляет сначала зарегистрироваться базовые классы для данного класса. Применительно к классу UObjectBase он ничего не делает.

### SetClass

```
private void  SetClass(
                  UClass *NewClass)

```

Параметры:

* NewClass — новый класс объекта.

Этот метод меняет класс, к которому относится объект, а также вносит необходимые изменения в хэш-таблицу имён. Сбор статистики для объекта начинается заново.

Для выполнения операций с хэш-таблицей имён вызываются функции UnhashObject и HashObject.

### SetFlagsTo

```
protected void  SetFlagsTo(
                    EObjectFlags  NewFlags)

```

Присваивает полю ObjectFlags заданное новое значение.

### ThisThreadAtomicallyClearedRFUnreachable

```
public bool  ThisThreadAtomicallyClearedRFUnreachable()

```

Атомарно сбрасывает флаг RF\_Unreachable в поле ObjectFlags. Возвращает true, если именно этот вызов привёл к сбросу данного флага, и false, если флаг был сброшен ещё до вызова этого метода или же после его вызова, но другим потоком.

## Поля

### Class

```
private UClass *Class

```

Класс, к которому принадлежит данный объект.

### InternalIndex

```
private int32  InternalIndex

```

Индекс данного объекта в массиве объектов; присваивается при добавлении объекта в массив и остаётся неизменным и уникальным всё время жизни объекта.

### Name

```
private FName  Name

```

Имя данного объекта, под которым он добавляется в хэш-таблицу имён.

### ObjectFlags

```
private EObjectFlags  ObjectFlags

```

Различные флаги, отражающие состояние объекта.

### Outer

```
private UObject *Outer

```

Объект, в котором находится данный объект.

### StatID

```
private mutable TStatId  StatID

```