我有一个我在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添加回调以显式释放该对象?
感谢。
答案 0 :(得分: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);