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 の結果の所有権は得られません。

関連記事