CFNetwork 的代理查询是可以直接在 C++ 中使用的 C API,把所有东西都转换成 Objective-C 对象并非必需。调用 CFNetworkCopyProxiesForURL 时传入目标 CFURL 和 CFNetworkCopySystemProxySettings 返回的设置,就能拿到按顺序排列的代理字典。

值所有权
由 Copy 创建或返回的对象,包括路由和设置归调用方所有;每个非空的自有对象都要释放
从数组中取出的字典,或通过 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 结果的持有权。

相关文章