Memory leaks 在Mac上调用CfNetworkExecuteProxy自动配置URL时泄漏

Memory leaks 在Mac上调用CfNetworkExecuteProxy自动配置URL时泄漏,memory-leaks,proxy,cfnetwork,cfrunloop,Memory Leaks,Proxy,Cfnetwork,Cfrunloop,我正在使用CFNetwork API检测操作系统代理设置。我的设置主要基于以下内容: 与此基本相同: 我使用CFNetworkCopyProxiesForURL获取代理列表,对于PAC类型,使用CFNetworkExecuteProxyAutoConfigurationURL获取并执行PAC脚本,立即在当前线程上运行运行循环,而当前线程已经不在ui线程上 这一切都正常工作,我已经仔细梳理了一遍,以确保我遵循create规则来正确发布结果。然而,当使用Xcode工具时,我发现发送给PAC::PA

我正在使用CFNetwork API检测操作系统代理设置。我的设置主要基于以下内容: 与此基本相同:

我使用CFNetworkCopyProxiesForURL获取代理列表,对于PAC类型,使用CFNetworkExecuteProxyAutoConfigurationURL获取并执行PAC脚本,立即在当前线程上运行运行循环,而当前线程已经不在ui线程上

这一切都正常工作,我已经仔细梳理了一遍,以确保我遵循create规则来正确发布结果。然而,当使用Xcode工具时,我发现发送给PAC::PACClient的std::shared ptr被_cfNetworkExecuteProxyAutoConfigurationUrlDelegate泄漏。由于那个物体从来没有暴露在我面前,我不知道如何控制它的释放,但它正在泄漏。这只是获取PAC文件的问题,显式代理不会泄漏。我曾尝试在所有的CFDictionary上添加冗余的CFRelease调用,并向我公开这些调用,以查看是否有内容被过度保留,但这并没有对PACClient泄漏造成影响

这在Mac上的cpp文件中,而不是ARC打开的项目中的目标C

有没有人遇到过这种泄漏并知道如何防止

下面是执行查找的代码段,它与上述项目中的所有步骤相同

struct PACRequestInfo {
    CFURLRef url; // Caller gets this from a dictionary, doesn't need release
    CFURLRef scriptURL; // Caller gets this from a dictionary, doesn't need release
    CFMutableArrayRef proxies; // Reference to a dictionary that is released by the caller
};

void resultCallback(void* client, CFArrayRef proxies, CFErrorRef error) {
    // Error handling removed for brevity
    if (CFTypeRef* resultPtr = (CFTypeRef*) client)
        *resultPtr = CFRetain(proxies);

    CFRunLoopStop(CFRunLoopGetCurrent());
}

// Provided PACRequestInfo is created on the stack by the caller
void doPACRequest(const PACRequestInfo& info) {
    CFTypeRef result = nullptr;
    CFStreamClientContext context = { 0, &result, nullptr, nullptr, nullptr };
    // Scoped ptr not shown but just calls CFRelease on destruction
    CFScopedPtr<CFRunLoopSourceRef> runLoopSource(CFNetworkExecuteProxyAutoConfigurationURL(info.scriptURL, info.url, resultCallback, &context));
    if (runLoopSource) {
        const static CFStringRef  kPrivateRunLoopMode = CFSTR("myprivateloop");
        CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource, kPrivateRunLoopMode);
        CFRunLoopRunInMode(kPrivateRunLoopMode, 1.0e10, false);
        CFRunLoopRemoveSource(CFRunLoopGetCurrent(), runLoopSource, kPrivateRunLoopMode);

        if (result && CFGetTypeID(result) == CFArrayGetTypeID()) {
            CFArrayRef resultArray = (CFArrayRef) result;
            CFArrayAppendArray(info.proxies, resultArray, CFRangeMake(0, CFArrayGetCount(resultArray)));
        }
    }

    // Retain was called on this value during ResultCallback.
    if (result) {
        CFRelease(result);
    }
}
struct PACRequestInfo{
CFURLRef url;//调用者从字典中获取,不需要发布
CFURLRef scriptURL;//调用者从字典中获取,不需要发布
CFMutableArrayRef proxies;//调用方发布的字典的引用
};
void resultCallback(void*客户端、CFArrayRef代理、CFErrorRef错误){
//为简洁起见,已删除错误处理
if(CFTypeRef*resultPtr=(CFTypeRef*)客户端)
*resultPtr=CFRetain(代理);
CFRunLoopStop(CFRunLoopGetCurrent());
}
//调用方在堆栈上创建提供的PACRequestInfo
无效doPACRequest(const PACRequestInfo&info){
CFTypeRef结果=空PTR;
CFStreamClientContext={0,&result,nullptr,nullptr,nullptr};
//未显示作用域ptr,但仅在销毁时调用CFRelease
CFScopedPtr runLoopSource(cfNetworkExecuteProxy自动配置url(info.scriptURL、info.url、resultCallback和context));
if(runLoopSource){
常量静态CFStringRef kPrivateRunLoopMode=CFSTR(“myprivateloop”);
CFRunLoopAddSource(CFRunLoopGetCurrent(),runLoopSource,kPrivateRunLoopMode);
CFRunLoopRunInMode(kPrivateRunLoopMode,1.0e10,false);
CFRunLoopRemoveSource(CFRunLoopGetCurrent(),runLoopSource,kPrivateRunLoopMode);
if(result&&CFGetTypeID(result)==CFArrayGetTypeID()){
CFArrayRef resultArray=(CFArrayRef)结果;
CFArrayAppendArray(info.proxies,resultArray,CFRangeMake(0,CFArrayGetCount(resultArray));
}
}
//ResultCallback期间对此值调用了Retain。
如果(结果){
发布(结果);
}
}

网络中似乎有很多东西泄漏。我有,这是另一个与代理相关的问题。