Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 如何将GCD对象放入CF集合(CFArray、CFDictionary)?_Cocoa_Grand Central Dispatch_Core Foundation - Fatal编程技术网

Cocoa 如何将GCD对象放入CF集合(CFArray、CFDictionary)?

Cocoa 如何将GCD对象放入CF集合(CFArray、CFDictionary)?,cocoa,grand-central-dispatch,core-foundation,Cocoa,Grand Central Dispatch,Core Foundation,部署目标是10.6,因此需要手动内存管理。 集合应负责保留/释放GCD对象 我相信对CFDictionary的CFArray的自定义回调会有所帮助,但是我正在寻找一个经过良好测试的解决方案。回调和集合创建非常简单: static const void * dispatchObjectRetainCallBack(CFAllocatorRef allocator, const void *value) { if (value) { dispatch_retain(value

部署目标是10.6,因此需要手动内存管理。 集合应负责保留/释放GCD对象


我相信对CFDictionary的CFArray的自定义回调会有所帮助,但是我正在寻找一个经过良好测试的解决方案。回调和集合创建非常简单:

static const void * dispatchObjectRetainCallBack(CFAllocatorRef allocator, const void *value)
{
    if (value) {
        dispatch_retain(value);
    }
    return value;
}

static void dispatchObjectReleaseCallBack(CFAllocatorRef allocator, const void *value)
{
    if (value) {
        dispatch_release(value);
    }
}

CFMutableArrayRef CreateDispatchHoldingArray()
{
    CFArrayCallBacks callBacks = {
        0,
        dispatchObjectRetainCallBack,
        dispatchObjectReleaseCallBack,
        NULL,
        NULL
    };
    return CFArrayCreateMutable(kCFAllocatorDefault, 0, &callBacks);
}

CFMutableDictionaryRef CreateDispatchHoldingDictionary()
{
    CFDictionaryValueCallBacks valueCallBacks = {
        0,
        dispatchObjectRetainCallBack,
        dispatchObjectReleaseCallBack,
        NULL,
        NULL
    };
    return CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &valueCallBacks);
}
稍微棘手的部分是将
dispatch\u对象\u t
s放入和移出集合。不能简单地将
dispatch\u object\u t
类型的变量强制转换为
void*
,因为
dispatch\u object\u t
是联合的类型定义。编译器给出了一个错误:

Operand of type 'dispatch_object_t' where arithmetic or pointer type is required
您必须检查
分派对象\u t
中的一种联合类型,如下所示:

void AddDispatchObjectToArray(CFMutableArrayRef array, dispatch_object_t obj)
{
    void* voidPtrObj = obj._do;
    CFArrayAppendValue(array, voidPtrObj);
}

dispatch_object_t GetDispatchObjectAtIndex(CFMutableArrayRef array, CFIndex index)
{
    dispatch_object_t result;
    result._do = (struct dispatch_object_s *)CFArrayGetValueAtIndex(array, index);
    return result;
}

其实没什么大不了的。对于数组,
CFArrayRetainCallBack
将调用
dispatch\u retain()
并返回原始对象,
CFArrayReleaseCallBack
将调用
dispatch\u release()
。“你有理由相信比那个显而易见的解决方案还需要更多吗?”KurtRevis如果你提供一个实现,我会接受它。