ObjectARX的对象引用关系以及深克隆

1、对象引用概念

1.1 概念


一个对象的引用可以是“硬引用”或者“软引用”,也可以是“所有权关系引用”和“指针引用”。

硬和软表示被引用的对象是否对引用对象的存在至关重要。一个硬引用表明,此对象的存在依赖于被引用的对象;

一个软引用表明,一个对象对其引用的对象存在某种关系,但不是至关重要的。

所有权关系引用决定了对象如何存档。如果一个对象拥有另外一个,那么无论何时当首个对象要存档时,其他被拥有的对象亦会存档。因为一个对象只能有一个所有者,所以所有权引用用于从数据库中非冗余地写入。

相反,指针引用用来描述AcDb对象之间的任意引用。指针引用用于完全(冗余)写入数据库。

比如,在下表中,双虚线表明是所有权引用。如果你沿着双虚线,每个对象只会碰到一次。如果你沿着单虚线(单虚线是指针引用),由于多个对象可以指向相同的对象,一个对象可能会碰到一次以上。要获得AcDbLine对象的完整“定义”,您需要遵循所有硬引用,包括所有权和指针(即单虚线和双虚线)引用。

1.2 所有权引用

当对象写入到DXF或者DWG文件中时,这个对象拥有的所有对象都会被同时写入。深克隆(Deep Clone)也会递归的复制每一个被拥有的对象。
硬所有权关系会阻止被拥有的对象被清理掉;而软所有权关系不会保护被拥有的对象被清理掉。
硬所有权关系的例子有:

  • 数据库对象是其扩展字典的硬所有权者
  • 块表是模型空间、图纸空间的硬所有权者(但不是其他块表记录的硬所有权者)
  • 扩展字典是其元素的硬所有权者。

软所有权引用关系的例子有:

  • 大多数情况下,符号表是其包含元素的软所有权拥有者(对*MODEL_SPACE, *PAPER_SPACE, *PAPER_SPACE0,以及图层0是例外;对这些元素,符号表维持了硬引用)。
  • 字典是其元素的软所有权者(不过,你可以标识字典是其元素的硬所有权拥有者)

1.3 指针引用

你的自定义类可以包含对数据库其他对象的硬或者软指针引用。指针是一个单向链接(即,被引用对象中没有指示指针来源的信息)。一个对象可以指向或被任何数量的其他对象指向。
硬指针引用保护引用的对象免于被清理。比如,一个对象包含对某个图层硬指针引用,那么你将不能清理这个图层。当将一个已存在的数据库写到一个新数据库当中时(比如使用了WBLOCK),所有硬指针都被会复制到这个新的数据库。
硬指针引用的例子:

  • 一个引线标注,包含对标注样式的硬指针引用。
  • 一个文本实体,包含对一个文字样式的硬指针引用
  • 一个标注实体,包含对一个标注样式的硬指针引用
  • 一个多线对象,包含对一个多线样式的硬指针引用

一个软指针就是指向一个对象的指针。它不会阻止清除被引用的对象。

软指针引用的例子:

  • Xdata引用是软指针
  • 永久反应器是软指针。

如果你使用一个软指针去引用一个对象,在打开它之前你应该确保它存在。


已发布

分类

来自

标签:

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理