1

私はCで書いたオブジェクトシステムを持っています。これにはオブジェクトの参照カウントが含まれています(オブジェクトはretainCount intを持つ構造体です)。次のようなブロックがある場合:

typedef void (^MyBlock)();

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

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

次に、ランタイムヒープ-Block_copyが呼び出されたときに整数iを割り当てます。ただし、代わりに参照カウントオブジェクトを使用する場合:

typedef void (^MyBlock)();

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

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

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

ありがとう。

4

1 に答える 1

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);
    }
};

使用法:

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);
于 2011-02-28T05:03:01.973 に答える