在 C++ 中直接读取 CFNetwork 代理结果
从 C++ 调用 Apple 的 C 代理查询 API,并让借用的字典值保持有效,而不要把不属于自己的对象释放掉。
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 结果的持有权。