对象

类对象的产生

调用函数产生出对象:

  1. 一个纯C++类型(F开发),通过 new 来产生对象。
  2. 继承自UObject但不继承自 Actor ,通过 NewObject 函数来产生对象。
  3. 类继承自 AActor ,通过 SpawnActor 函数来产生出对象。

NewObject 函数调用:

NewObject<T>()

返回指向类的指针,这个对象被分配到临时包中,下一次加载会被清除。

类继承自 Actor ,需要通过 UWorld 对象获得 SpawnActor 函数来产生出对象:

GetWorld( ) -> SpawnActor<AYourActorClass>( )

类对象的获取

获取一个类对象的唯一方法,就是通过某种方法传递到这个对象的指针或引用。

获取一个场景中某种 Actor 的所有实例:

for(TActorIterator<AActor> Iterator(GetWorld());Iterator;++Iterator)
{
                ...//do  something
}                

TActorIterator 的泛型参数不一定是 Actor ,可以是你需要查找的其他类型,通过

*Iterater

来获取指向实际对象的指针,或者直接通过

Iterater -> YourFuntion(

来调用需要的成员函数。

类对象的销毁

 纯C++类是在函数体中创建,而不是通过 new 来分配内存:

void YourFunction( )
{
        FYourClass  YourObject=FYourClass( );
        ...//Do something
}               

这个类的对象会在函数调用结束后,随着函数栈空间的释放,一起释放掉。

如果纯C++类是使用 new 来分配内存,直接传递类的指针。需要意识到:除非手动删除,否则这一块内存将永远不会被释放

如果纯C++类使用 new 来分配内存,同时使用智能指针 TsharedPtr/Tshared-Ref 来进行管理,那么类对象不需要也不应该被手动释放。智能指针会使用引用计数来完成自动的内存释放。

可以使用 MakeShareable 函数来转化普通指针为智能指针:

TsharePtr<YourClass> YourClassPtr = MakeShareable(new YourClass());

在没有充分把握之前,不要使用手动 new/delete 方案,可以使用智能指针。

Uobject类

无法使用智能指针来管理 UObject 对象。

UObject 采用自动垃圾回收机制。放一个类的成员变量指向 UObject 的对象,同时又带有 UPROPERTY 宏定义,那么这个成员变量将触发引用计数机制。

垃圾回收器会定期从根节点 Root 开始检查,当一个 UObject 没有被别的任何 UObject 引用,就会被垃圾回收。

通过 AddToRoot 函数来让一个 UObejct 一直不被回收。

Actor类

Actor 对象可以通过调用 Destroy 函数来请求销毁,意味着当前 Actor 从所属的世界中“摧毁”,但是对象对应内存的回收依然由系统决定。

posted @ 2019-07-03 14:09  CodeWithMe  阅读(228)  评论(0)    收藏  举报