首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用clang实现块的自定义保留-释放

如何使用clang实现块的自定义保留-释放
EN

Stack Overflow用户
提问于 2011-02-09 07:08:07
回答 1查看 269关注 0票数 1

我有一个对象系统,它是我用C语言编写的,它包含了对象的引用计数(对象只是具有retainCount整型的结构)。如果我有一个如下所示的块:

代码语言:javascript
复制
typedef void (^MyBlock)();

void doBlockStuff(MyBlock b){
    Block_copy(b);
    //...
}

__block int i=0;
doBlockStuff(^{
   ++i; 
});

然后,运行时堆在调用Block_copy时分配整数i。但是,如果我使用引用计数的对象:

代码语言:javascript
复制
typedef void (^MyBlock)();

void doBlockStuff(MyBlock b){
    Block_copy(b);
    //...
}

__block Object* obj=Object_New();
doBlockStuff(^{
   DoObjectStuff(obj); 
});

然后,指针本身,而不是它的引用值,由运行时堆分配(尽管它已经由Object_New函数堆分配)。因为对象是引用计数的,所以另一个函数可能会出现,并在块释放之前释放对象。如果我显式地保留该对象,那么它将永远不会被释放。所以,我的问题是,当对象被释放时,我如何向Block_dealloc添加一个回调来显式地释放它?

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-02-28 13:03:02

将C对象*包装在__block存储C++类型中。大概是这样的:

类:

代码语言:javascript
复制
template<typename T>
class ObjectPtr
{
public:
    T* ptr;
public:
    ObjectPtr(T* val) : ptr(val)
    {
        Object_Retain(ptr);
    }

    virtual ~ObjectPtr()
    {
        Object_Release(ptr);
    }
};

用法:

代码语言:javascript
复制
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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4939575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档