2011-02-08 40 views
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被釋放時顯式釋放對象,如何添加回調?

謝謝。

+0

你的問題是相當混亂(不是你的錯)在`Object`是根類Objective-C的環保,無毒在'NSObject`之前由AppKit使用。實際上,當塊被複制/釋放時,您需要像自動保留/釋放那樣執行`NSObject`? – bbum 2011-02-09 08:12:12

回答

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