2016-07-24 9 views
2

どのように私のオブジェクトのフィールドを自由にすることができますRttiデルファイ(XE4)で?フリーオブジェクトのフィールドRtti

私はフィールドを見つけることができますが、私はそれらを解放する方法を今ない動的

をすべてのフィールドを解放する必要が

destructor TKnBase.Destroy; 
var 
    AContext: TRttiContext; 
    AField: TRttiField; 
begin 
    for AField in AContext.GetType(Self.ClassInfo).GetFields do 
    begin 
    -->free filed (AField) 
    end; 

    inherited; 
end; 

私はこれをしようとしたが動作しません。

destructor TKnBase.Destroy; 
type 
    dp = ^TObject; 
var 
    AContext: TRttiContext; 
    AField: TRttiField; 
    p: dp; 
begin 
    for AField in AContext.GetType(Self.ClassInfo).GetFields do 
    begin 
    p := dp(NativeInt(AField) + AField.Offset); 
    TObject(p^).Free; 
    end; 

    inherited; 
end; 

答えて

3

オフセットはインスタンスポインタからの相対値です。あなたのコードは次のようになります。

p := dp(NativeInt(Self) + AField.Offset); 

あなたは、フィールドの値を読み取るために、フィールドオブジェクトのGetValueメソッドを使用することを好むかもしれません。そして、すべてのポインタ演算を避けてください。

あなたがここで行っていることは非常に限定的です。派生クラスはすべてこのポリシーに適合させる必要があります。すべてのフィールドはオブジェクトでなければならず、このクラスが所有している必要があります。整数フィールド、ブールフィールドなどは使用できません。少なくとも、オブジェクトであるフィールドだけを破壊しようとするべきです。

私の本能は、あなたが試みていることがうまくいかないことを証明します。

+0

私はそれを知っていますが、私はフリーフィールドへのアプローチとしてこれを使用したくありません。それは特定の条件の問題のためだけです。 –

+0

@ Pejman.Nik物事を破壊するためにRTTIに頼るために "一定の条件"が必要な場合がありますか? –

+1

また、 'GetType(Self.ClassInfo).GetFields'もすべての派生フィールドを取得しませんか?派生したデストラクタとベースデストラクタが同じフィールドを解放しようとすると危険です。代わりに 'GetType(TKnBase).GetDeclaredFields'が必要でしょうか? –