这篇文章是在Remy Lebeau 的帮助下在C++ Builder 期刊论坛上提出的一个问题的继续。我的问题是对 Delphi RTTI 以及如何在 C++ Builder 中使用它缺乏了解。有很多关于如何使用 RTTI 获取类型信息等的文档,但没有太多如何使用它进行发现的文档。
根据我的理解,下面应该设置 RTTI 发现的方法:
class DELPHICLASS MyClass : public MyOtherClass
{
public:
//Methods...
__published:
//Methods...
}
这是我目前的课程,它覆盖了 Embarcadero iOS API iOSapi.UIKit.hpp 中的 UIAlertViewDelegate 接口中的虚拟方法。
class DELPHICLASS TAlertViewDelegate : public TOCLocal, public UIAlertViewDelegate
{
typedef Macapi::Objectivec::TOCLocal inherited;
INTFOBJECT_IMPL_IUNKNOWN(TOCLocal);
public:
virtual void __cdecl alertView(_di_UIAlertView alertView, aarch_int_t clickedButtonAtIndex);
virtual void __cdecl alertViewCancel(_di_UIAlertView alertView);
virtual void __cdecl didPresentAlertView(_di_UIAlertView alertView);
virtual void __cdecl alertViewDidDismissWithButtonIndex(_di_UIAlertView alertView, aarch_int_t didDismissWithButtonIndex);
};
但是,当我创建此类的一个实例并使用以下方法在堆上分配它时:
_di_UIAlertViewDelegate Delegate = (UIAlertViewDelegate *)new TAlertViewDelegate();
我收到与 Delphi 相关的 RTTI 错误:
第一次机会例外在 $00158015。异常类 EObjectiveC 带有消息“未找到类型 UIAlertViewDelegate 的 RTTI。也许缺少 {$M+}?'。流程代表 (250202)
将我的类方法从 public 更改为 __published 可以消除此错误,但会导致访问冲突,但查看调用堆栈发生的情况是:
- 调用 TOCLocal 构造函数
- TRttiType GetMethods 调用
- 读取方法数据
- 读取扩展方法数据
- 读取对象
- 读取对象指针
- 读取对象(再次)
- 创建 TRTTIInstanceMethodClassic
- 访问冲突
很明显,RTTI 有问题,因为它在尝试获取方法信息后崩溃了?有经验的人可以在这里提供帮助吗?