查看: 888|回复: 10

[编程指南] 【弱指针 | Unreal Engine】

[复制链接]

1

主题

342

帖子

7万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
75866
发表于 2016-6-27 01:28:41 | 显示全部楼层 |阅读模式


本页面的内容:

      
声明和初始化

解引用和访问

使用弱指针断开引用循环

转换
     
弱指针存储了一个对象的 弱引用 。和共享指针不同,弱指针不会阻止对象被销毁。无论谁销毁了弱指针引用的对象,弱指针都将自动清空。这也意味着,您可能会出乎意外地发现弱指针变为空了,弱指针可以用于断开引用循环。

当不存在到弱指针的对象的共享引用时,将会销毁该对象。

弱指针可以帮助您表明意图。当您在一个类中看到一个弱指针时,您便知道这个类仅是缓存了一个到该对象的指针,并不会控制该对象的生命周期。
声明和初始化
弱指针都是基于共享指针/引用 或 其他的弱指针进行创建的。

// 分配新的树节点TSharedRefFTreeNode NodeOwner( new FTreeNode() );// 对新的树节点创建弱指针TWeakPtrFTreenode NodeObserver( NodeOwner );
记住,弱指针不会阻止销毁对象。如果重置了NodeOwner但NodeObserver仍在效果范围内,那么将会删除对象:

// 销毁节点NodeOwner.Reset();
弱指针可以随意地进行安全的复制,就像共享指针一样。

TWeakPtrFTreeNode NodeObserverB = NodeObserver;
当您使用完一个弱指针时,您可以重置(或重新分配)它。

NodeObserver = NULL;解引用和访问
要想访问一个弱指针的对象,首先需要调用 Lock() 方法将其提升为共享指针。

// 通过弱指针来获取对节点的访问TSharedPtrTFreeNode LockedObserver( NodeObserver.Lock() );If( LockedObserver.IsValid() ){    //对象仍存在,因此可以访问它    LockedObserver-ListChildren();}
Lock() 函数执行很快。之所以称为Lock(锁定)是因为当临时访问弱指针时它可以阻止对象被销毁。

当弱指针的对象被删除时,它会自动知道,以便您可以通过使用 IsValid() 方法以安全的方式处理这些情况。

//请在访问弱指针的对象前确认其仍然存在if( NodeObserver.IsValid() ){    ...}使用弱指针断开引用循环
您可以使用弱指针断开引用循环:

class FTreeNode{    /** 子节点,由此节点所有 */    TArray TSharedPtrFTreeNode  Children;    /** 返回到此节点父类的弱指针 */    TWeakPtrFTreeNode Parent;}
FTreeNode 具有共享指针,这些共享指针指向 FTreeNode 所 拥有 的子节点。这将意味着这些子节点将随着它一起销毁。它也使用了一个弱指针,缓存了到其父项节点的引用。弱指针永远不会阻止对象被销毁。通过这样使用共享指针/弱指针,使得权力链更加明显。

当弱指针的对象被删除时,弱指针能“自动知道”,所以您可以这样安全地缓存到树中的任何节点的指针。
转换
您可以使用 Pin() 方法把弱指针转换为共享指针。没有显性的构造函数。
回复

使用道具 举报

0

主题

869

帖子

2804

积分

vip会员

Rank: 1

积分
2804
发表于 2016-7-2 19:49:49 | 显示全部楼层
看一下你发的到底是什么鬼!
回复 支持 反对

使用道具 举报

0

主题

1246

帖子

3918

积分

vip会员

Rank: 1

积分
3918
发表于 2016-7-4 02:04:15 来自手机 | 显示全部楼层
这个不错这个不错这个不错
回复 支持 反对

使用道具 举报

0

主题

826

帖子

2765

积分

vip会员

Rank: 1

积分
2765
发表于 2016-7-4 11:56:08 | 显示全部楼层
楼主辛苦
回复 支持 反对

使用道具 举报

0

主题

849

帖子

2806

积分

vip会员

Rank: 1

积分
2806
发表于 2016-7-4 13:21:19 来自手机 | 显示全部楼层
支持一下,3q
回复 支持 反对

使用道具 举报

0

主题

848

帖子

2756

积分

vip会员

Rank: 1

积分
2756
发表于 2016-7-11 15:11:50 | 显示全部楼层
一定要看看。。。。。。
回复 支持 反对

使用道具 举报

0

主题

853

帖子

2832

积分

vip会员

Rank: 1

积分
2832
发表于 2016-7-12 18:49:31 | 显示全部楼层
看看价钱,然后考虑。
回复 支持 反对

使用道具 举报

0

主题

856

帖子

2824

积分

vip会员

Rank: 1

积分
2824
发表于 2016-7-13 01:26:24 | 显示全部楼层
我一天来看一回,看看能不能打折。
回复 支持 反对

使用道具 举报

0

主题

841

帖子

2763

积分

vip会员

Rank: 1

积分
2763
发表于 2016-7-14 16:29:52 | 显示全部楼层
啊啊啊啊,好多好多好多
回复 支持 反对

使用道具 举报

0

主题

815

帖子

2680

积分

vip会员

Rank: 1

积分
2680
发表于 2016-7-16 17:23:25 来自手机 | 显示全部楼层
来看看
回复 支持 反对

使用道具 举报

*滑块验证:
您需要登录后才可以回帖 登录 | enginedx注册

本版积分规则

 
 



邮件留言:


 
返回顶部