delphi - 退出RTTI相关函数后访问冲突:结果消失
问题描述
以前我有一个函数可以通过 RTTI 获取对象属性并设置它的值。现在我决定将其拆分TRTTI.GetObjProp
,TRTTI.SetObjPropValue
以便缓存返回的值TRTTI.GetObjProp
并加快数据处理。
奇怪的事情在那之后发生了。首先,我突然注意到它ctx.GetType
有效并且一直有效,尽管我从未初始化ctx
变量。好的,如果我用 初始化它TRttiContext.Create()
,第二个怪异没有任何变化:
我调用这个TRTTI.GetObjProp
函数,只要我在这个函数中,Result
它就被定义了,我可以用调试器请求它的属性。当我退出该函数时,我尝试请求rprop
变量的相同属性并获得访问冲突错误。根据调试器,rprop
被定义。
procedure TConfManager._setValue(indicator: TComponent; name: string; value: OleVariant);
var
rprop: TRttiProperty;
begin
rprop := TRTTI.GetObjProp(indicator, name);
//Access violation here when I try to use rprop
TRTTI.SetObjPropValue(indicator, rprop, value);
end;
class function TRTTI.GetObjProp(obj: TObject; propName: string): TRttiProperty;
var
ctx: TRttiContext;
rtyp: TRttiType;
begin
if obj = nil then Exit(nil);
rtyp := ctx.GetType(obj.ClassType);
Result := rtyp.GetProperty(propName);
end;
为什么当我在函数中时函数结果被正确定义,但当我离开它时却没有正确定义?
解决方案
TRttiProperty
实例归TRttiContext
对象所有。当您的局部变量ctx
离开作用域时,该TRttiContext
对象将被销毁,并带走它拥有的所有对象,包括您的TRttiProperty
实例。
您需要确保TRttiContext
拥有您使用的任何 RTTI 对象的对象至少与对这些拥有的对象的任何引用一样长。实现这一点的最简单方法可能是使TRttiContext
对象成为全局变量。
推荐阅读
- python - 如何在 Python 中向 matplotlib.annotate 添加百分比符号?
- r - 更改R中注释的字体大小
- c# - GDI+ 中出现一般错误。在保存压缩的 img 时,Microsoft 的代码片段是否有问题
- c# - 读取大型 CSV 文件的更快方法
- angular - 无法加载 PDF 文档 - Angular 8
- javascript - vanilla JS函数中的回调并不总是有效?
- django-models - 在 django 的管理站点中看不到记录
- python - 将字符串 "%Y-%M-%D" 转换为 "YYYY-MM-DD" 以用于 openpyxl NamedStyle number_format
- python - TypeError:get_dummies() 得到了一个意外的关键字参数“drop_first”
- python - 将具有不同索引的数据框添加到时间序列