如何实现自定义保留释放块与铿锵

问题描述:

我有一个对象系统,我用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

你的问题是相当混乱(不是你的错)在`Object`是根类Objective-C的环保,无毒在'NSObject`之前由AppKit使用。实际上,当块被复制/释放时,您需要像自动保留/释放那样执行`NSObject`? – bbum 2011-02-09 08:12:12

将你的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);