展開ターゲットは 10.6 であるため、手動のメモリ管理が必要です。コレクションは、GCD オブジェクトの保持/解放を処理する必要があります。
CFDictionary の CFArray のカスタム コールバックが役立つと思いますが、ドロップインで十分にテストされたソリューションを探しています
展開ターゲットは 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_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;
}