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 Object* 包装在 __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 回答