0
배포 대상이 10.6이므로 수동 메모리 관리가 필요합니다. 컬렉션은 GCD 객체를 유지/해제해야합니다. CFDictionary의 CFArray 도움이 될위한 GCD 객체를 CF 컬렉션 (CFArray, CFDictionary)에 넣을 수 있습니까?
나는 잘 테스트 솔루션 그러나 나는 드롭 인 (drop-in)을 찾고, 사용자 정의 콜백을 생각배포 대상이 10.6이므로 수동 메모리 관리가 필요합니다. 컬렉션은 GCD 객체를 유지/해제해야합니다. CFDictionary의 CFArray 도움이 될위한 GCD 객체를 CF 컬렉션 (CFArray, CFDictionary)에 넣을 수 있습니까?
나는 잘 테스트 솔루션 그러나 나는 드롭 인 (drop-in)을 찾고, 사용자 정의 콜백을 생각콜백 및 수집 생성은 간단합니다 :
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
의 변수는 이 공용체의 typedef이기 때문에 void *
에 단순히 캐스팅 할 수 없습니다.
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