0

展開ターゲットは 10.6 であるため、手動のメモリ管理が必要です。コレクションは、GCD オブジェクトの保持/解放を処理する必要があります。

CFDictionary の CFArray のカスタム コールバックが役立つと思いますが、ドロップインで十分にテストされたソリューションを探しています

4

1 に答える 1

2

コールバックとコレクションの作成は簡単です。

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_object_t、 をコレクションに出し入れすることです。は共用体の型定義でdispatch_object_tあるvoid *ため、型の変数を単純に にキャストすることはできません。dispatch_object_tコンパイラはエラーを出します:

Operand of type 'dispatch_object_t' where arithmetic or pointer type is required

dispatch_object_t次のように、内のユニオン タイプの 1 つを通過する必要があります。

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;
}
于 2013-01-05T10:20:46.180 に答える