一.断言
1.checkNoEntry();
检测程序进入到这个函数中了吗,进入则断开
2.checkNoReentry();
检测函数是否被执行了两次;
3.checkNoRecursion();
递归检测,如果递归就崩溃.
4.ensure(0 && "打印信息");
其中0为bool,为零会在此打断,程序会阻塞在这里,用于调试
二.共享指针(TSharedPtr)
1.优势
1> 可以避免循环引用
2> 由系统管理释放,无需手动操作
3> 存在引用计数
2.使用方式
1>创建共享指针
TSharedPtr<类名>TempPtr (new 类名)
也可以这样创建:
TSharedPtr<类名>TempPtr;
TempPtr = MakeSharedPtr(new 类名);
2>解引用
TempPtr.Get();
3> 重置共享指针
TempPtr.Rest();
TempPtr=NULL;
4>获取引用计数
TempPtr.GetSharedReferenceCount();
5>判断是否唯一
TempPtr.IsUnique();
二.共享引用(TSharedRef)
1.概念
用法与TSharedPtr相似,与TSharedPtr相比,共享引用更加安全。因为引用不能置空,共享引用的初始化一般通过MakeShared或共享指针的ToSharedRef函数赋值,所以更加安全。
一般在函数参数传递和作为返回值时使用,共享引用没有IsValid进行有效判断,如果要判断有效性,可通过Get获取原生指针判定.
2.使用方式
1>创建
TSharedRef<类名> TempRef = MakeShared<类名>();
2>与共享指针的转换(.ToSharedRef())
//共享指针转共享引用
TSharedPtr<类名> TempPtr= MakeShareable(new 类名());
TempRef = TempPtr.ToSharedRef();
//共享引用转共享指针
TempPtr = TempRef;//可以直接隐式转换
三.弱指针(TWeakPtr)
1.概念
弱指针不参与引用计数,同时,弱指针指的对象如无其他指针指向,弱指针无效,所以用前先判断下
2.使用方式
1>创建
TWeakPtr<类名>TempWPr;
2>有效判定
TempWPr.IsVaild();
3>转为共享指针
//弱指针的.Pin(),会返回一个智能指针
TSharedPtr<类名>newPtr(TempWPr.Pin());
四:TSharedFromThis模板类
普通c++类一旦继承这个类,会在类里保存一个弱指针,
当通过智能指针获取到该类的普通指针时,可以通过调用AsShared方法获取到该类的智能指针。
1>例子
class TestA:public TSharedFromThis<TestA>
{
}
TSharedPtr<TestA> TestPtr = MakeShareable(new TestA());
TestA* NormalPtr = TestPtr.Get();
TSharedPtr<TestA> TestPtr2 = NormalPtr ->AsShared();
注意:只有先MakeShareable创建智能指针赋值给的普通指针,才能用AsShared转为智能指针,普通new一个是不行的,因为只有通过MakeShareable创建才会初始化里面保存的弱指针,否则调用AsShared失败会引起崩溃.
五.单播代理
1>创建代理
DECLARE_DELEGATE(xxx);//单播无参xxx代理
DECLARE_DELEGATE_OneParam(xxx,bool);//单播有参为bool的xxx代理;
DECLARE_DELEGATE_RetVal(bool,xxx);//单播无参返回值为bool的xxx代理;
DECLARE_DELEGATE_RetVal_OneParam(int32,xxx,FString&);//单播有参数FString&,返回值为Int32的xxx代理;
2>实例化
XXX TA;//创建一个代理实例
3>给代理绑定方法
TA.BindRaw(this,&方法名);//绑定原生C的方法;
TA.BindSP(this,&方法名);//绑定智能指针
TA.BindUObject(this,&方法名);//绑定Object类;
TA.BindStatic(函数名);//绑定静态函数
TA.BindFunction(this,TEXT("函数名"))//同上
4>调用代理
TA.ExecuteIfBound(此处有参就传参);
六.多播代理
与单播代理基本一致,但是没有返回值
DECLARE_MULTICAST_DELEGATE(FDelegateTaskE);
FDelegateTaskE DelegateTaskE;
DelegateTaskE.AddRaw(this,&方法名);//绑定方法
调用代理
DelegateTaskE.Broadcast(有参传参);
//区别是可以绑定多个函数,对目标为弱引用,可以和结构体一起使用,可以很方便地进行拷贝,等等。
七.动态多播代理
1>创建
DECLARE_DYNAMIC_DELEGATE_OneParam(FDelegateTaskG,FString&,Str_C );
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FDelegateTaskH,FString&,Str_C);
2>实例化
FDelegateTaskG DelegateTaskG;
FDelegateTaskH DelegateTaskH;
3>绑定方法
DelegateTaskG.BindDynamic(this,&方法名);
DelegateTaskH AddDynamic(this,&方法名);
4>调用代理
DelegateTaskG.ExecuteIfBound(TempF);
DelegateTaskH.Broadcast(TempF);
如果动态单播代理绑定了多个方法,只执行最后一个,也就是只能绑定一个.