1、对象引用概念
1.1 概念
一个对象的引用可以是“硬引用”或者“软引用”,也可以是“所有权关系引用”和“指针引用”。
硬和软表示被引用的对象是否对引用对象的存在至关重要。一个硬引用表明,此对象的存在依赖于被引用的对象;
一个软引用表明,一个对象对其引用的对象存在某种关系,但不是至关重要的。
所有权关系引用决定了对象如何存档。如果一个对象拥有另外一个,那么无论何时当首个对象要存档时,其他被拥有的对象亦会存档。因为一个对象只能有一个所有者,所以所有权引用用于从数据库中非冗余地写入。
相反,指针引用用来描述AcDb对象之间的任意引用。指针引用用于完全(冗余)写入数据库。
比如,在下表中,双虚线表明是所有权引用。如果你沿着双虚线,每个对象只会碰到一次。如果你沿着单虚线(单虚线是指针引用),由于多个对象可以指向相同的对象,一个对象可能会碰到一次以上。要获得AcDbLine对象的完整“定义”,您需要遵循所有硬引用,包括所有权和指针(即单虚线和双虚线)引用。

1.2 所有权引用
当对象写入到DXF或者DWG文件中时,这个对象拥有的所有对象都会被同时写入。深克隆(Deep Clone)也会递归的复制每一个被拥有的对象。
硬所有权关系会阻止被拥有的对象被清理掉;而软所有权关系不会保护被拥有的对象被清理掉。
硬所有权关系的例子有:
- 数据库对象是其扩展字典的硬所有权者
- 块表是模型空间、图纸空间的硬所有权者(但不是其他块表记录的硬所有权者)
- 扩展字典是其元素的硬所有权者。
软所有权引用关系的例子有:
- 大多数情况下,符号表是其包含元素的软所有权拥有者(对*MODEL_SPACE, *PAPER_SPACE, *PAPER_SPACE0,以及图层0是例外;对这些元素,符号表维持了硬引用)。
- 字典是其元素的软所有权者(不过,你可以标识字典是其元素的硬所有权拥有者)
1.3 指针引用
你的自定义类可以包含对数据库其他对象的硬或者软指针引用。指针是一个单向链接(即,被引用对象中没有指示指针来源的信息)。一个对象可以指向或被任何数量的其他对象指向。
硬指针引用保护引用的对象免于被清理。比如,一个对象包含对某个图层硬指针引用,那么你将不能清理这个图层。当将一个已存在的数据库写到一个新数据库当中时(比如使用了WBLOCK),所有硬指针都被会复制到这个新的数据库。
硬指针引用的例子:
- 一个引线标注,包含对标注样式的硬指针引用。
- 一个文本实体,包含对一个文字样式的硬指针引用
- 一个标注实体,包含对一个标注样式的硬指针引用
- 一个多线对象,包含对一个多线样式的硬指针引用
一个软指针就是指向一个对象的指针。它不会阻止清除被引用的对象。
软指针引用的例子:
- Xdata引用是软指针
- 永久反应器是软指针。
如果你使用一个软指针去引用一个对象,在打开它之前你应该确保它存在。

发表回复