C++에서 CFNetwork 프록시 결과 직접 읽기
Apple의 C 프록시 조회 API를 C++에서 사용하고, 빌려온 딕셔너리 값을 소유 객체로 해제하지 않고 살려 두십시오.
CFNetwork의 프록시 조회는 C++에서 곧바로 쓸 수 있는 C API이며, 모든 것을 Objective-C 객체로 바꾸는 일은 선택 사항입니다. CFNetworkCopyProxiesForURL를 대상 CFURL과 CFNetworkCopySystemProxySettings의 설정과 함께 호출하면 정렬된 프록시 딕셔너리를 얻습니다.
| 값 | 소유권 |
|---|---|
| Copy가 만들거나 반환한 객체(경로와 설정 포함) | 호출자가 소유합니다. null이 아닌 소유 객체는 각각 해제하십시오 |
| 배열에서 얻은 딕셔너리 또는 Get을 통해 딕셔너리에서 얻은 호스트 이름 | 빌려온 값입니다. 유지하지 않았다면 해제하지 마십시오 |
유효한 routes와 범위 안의 인덱스라면 추출은 다음과 같습니다.
CFDictionaryRef proxy = static_cast<CFDictionaryRef>(
CFArrayGetValueAtIndex(routes, index));
CFStringRef hostname = static_cast<CFStringRef>(
CFDictionaryGetValue(proxy, kCFProxyHostNameKey));
항목을 엔드포인트로 다루기 전에 kCFProxyTypeKey를 읽으십시오. 직접 후보와 자동 구성 후보는 서로 다르게 처리해야 합니다.
소유자가 살아 있는 동안 특정 항목의 CFString 호스트 이름과 CFNumber 포트를 변환하십시오. 추출한 C++ 값은 그다음 전송 계층 구성으로 넘길 수 있습니다. 결과 이후에도 CFString 자체를 유지하려면 먼저 유지하고 나중에 CFRelease로 균형을 맞추십시오. 그렇지 않다면 그것을 담은 소유자를 해제하기 전에 작업을 마치십시오.
정리 단계에서 생성/복사한 대상 URL, 설정 딕셔너리, 결과 배열을 해제하고 필요하면 스코프 가드를 사용하십시오. 변수의 CFStringRef 타입만으로는 Get 결과에 대한 소유권이 생기지 않습니다.