2011-02-08 8 views
1

私はオブジェクトの参照カウントを含むCで書いたオブジェクトシステムを持っています(オブジェクトはretainCount intを持つ構造体です)。私は、次のようにブロックしている場合:clangでブロックのカスタム保持リリースを実装する方法

typedef void (^MyBlock)(); 

void doBlockStuff(MyBlock b){ 
    Block_copy(b); 
    //... 
} 

__block int i=0; 
doBlockStuff(^{ 
    ++i; 
}); 

を、ランタイムのBlock_copyが呼び出される整数私のヒープは、割り当てられます。私の代わりに参照カウントオブジェクトを使用する場合は、(それが既にObject_New関数によってヒープに割り当てられているが)

typedef void (^MyBlock)(); 

void doBlockStuff(MyBlock b){ 
    Block_copy(b); 
    //... 
} 

__block Object* obj=Object_New(); 
doBlockStuff(^{ 
    DoObjectStuff(obj); 
}); 

は、次に、ポインタ自体ではなく、それは参照の値は、ヒープ割り当てランタイムによるものです。オブジェクトは参照カウントされているため、ブロックが解放される前に別の関数がオブジェクトを解放して解放する可能性があります。オブジェクトを明示的に保持すると、決して解放されません。ですから、私の質問は、解放されたときにオブジェクトを明示的に解放するために、Block_deallocにコールバックを追加する方法です。

ありがとうございました。

+0

あなたの質問は(あなたのせいではない)、かなり混乱しては、Objective-Cの環境のルートクラスでしたNSObjectの前にAppKitによって使用されます。実際には、ブロックがコピー/解放されるときに、自動保持/解放のような 'NSObject'を実行する必要がありますか? – bbum

+0

私はobjective-cを使用していません。私はCを使用しています。問題は、ブロックが解放されたときにコールバックする必要があることです。 – Maz

+0

右 - **あなたがllvm 2.xの最新バージョンを使用していると仮定して**、ブロック付きC++のサポートが大幅に改善されました。コピーコンストラクタと対応するデストラクタを使用して、必要な処理を行うことができます。たぶん(私は確かにそのことを十分に探求していない)。 – bbum

答えて

0

Cオブジェクト*を__blockストレージのC++タイプにラップします。

クラス::

template<typename T> 
class ObjectPtr 
{ 
public: 
    T* ptr; 
public: 
    ObjectPtr(T* val) : ptr(val) 
    { 
     Object_Retain(ptr); 
    } 

    virtual ~ObjectPtr() 
    { 
     Object_Release(ptr); 
    } 
}; 

は使用方法:そうな何かその `Object`で

struct Object* blah = Object_New(); 
__block ObjectPtr<Object> obj = ObjectPtr<Object>(blah); 
Object_Release(blah); 
b = ^void(void){obj.ptr;};  
b = Block_copy(b); 
// ... 
b(); 
Block_release(b); 
関連する問題