0
部署目標是10.6,因此需要手動內存管理。 收集應該照顧保留/釋放GCD物體。如何將GCD對象放入CF集合(CFArray,CFDictionary)?
我相信定製回調CFDictionary的CFArray會有所幫助,但是我正在尋找一個下拉,經過嚴格測試的解決方案
部署目標是10.6,因此需要手動內存管理。 收集應該照顧保留/釋放GCD物體。如何將GCD對象放入CF集合(CFArray,CFDictionary)?
我相信定製回調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
裏面,像這樣:
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_retain()'並返回原始對象,而您的'CFArrayReleaseCallBack'將調用'dispatch_release()'。你有沒有理由相信比這個明顯的解決方案更有必要? –
@KurtRevis如果你提供了一個實現,我會接受它。 – Kentzo