2013-01-03 18 views
0

部署目標是10.6,因此需要手動內存管理。 收集應該照顧保留/釋放GCD物體。如何將GCD對象放入CF集合(CFArray,CFDictionary)?

我相信定製回調CFDictionary的CFArray會有所幫助,但是我正在尋找一個下拉,經過嚴格測試的解決方案

+1

還有的實在不多了。對於數組,您的'CFArrayRetainCallBack'將調用'dispatch_retain()'並返回原始對象,而您的'CFArrayReleaseCallBack'將調用'dispatch_release()'。你有沒有理由相信比這個明顯的解決方案更有必要? –

+0

@KurtRevis如果你提供了一個實現,我會接受它。 – Kentzo

回答

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裏面,像這樣:

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; 
}