我有一个对象系统,它是我用C语言编写的,它包含了对象的引用计数(对象只是具有retainCount整型的结构)。如果我有一个如下所示的块:
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添加一个回调来显式地释放它?
谢谢。
发布于 2011-02-28 13:03:02
将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);https://stackoverflow.com/questions/4939575
复制相似问题