2013-01-03 5 views
0

배포 대상이 10.6이므로 수동 메모리 관리가 필요합니다. 컬렉션은 GCD 객체를 유지/해제해야합니다. CFDictionary의 CFArray 도움이 될위한 GCD 객체를 CF 컬렉션 (CFArray, CFDictionary)에 넣을 수 있습니까?

나는 잘 테스트 솔루션 그러나 나는 드롭 인 (drop-in)을 찾고, 사용자 정의 콜백을 생각

+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의 변수는 이 공용체의 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; 
}