Memory leaks 在Mac上调用CfNetworkExecuteProxy自动配置URL时泄漏
我正在使用CFNetwork API检测操作系统代理设置。我的设置主要基于以下内容: 与此基本相同: 我使用CFNetworkCopyProxiesForURL获取代理列表,对于PAC类型,使用CFNetworkExecuteProxyAutoConfigurationURL获取并执行PAC脚本,立即在当前线程上运行运行循环,而当前线程已经不在ui线程上 这一切都正常工作,我已经仔细梳理了一遍,以确保我遵循create规则来正确发布结果。然而,当使用Xcode工具时,我发现发送给PAC::PACClient的std::shared ptr被_cfNetworkExecuteProxyAutoConfigurationUrlDelegate泄漏。由于那个物体从来没有暴露在我面前,我不知道如何控制它的释放,但它正在泄漏。这只是获取PAC文件的问题,显式代理不会泄漏。我曾尝试在所有的CFDictionary上添加冗余的CFRelease调用,并向我公开这些调用,以查看是否有内容被过度保留,但这并没有对PACClient泄漏造成影响 这在Mac上的cpp文件中,而不是ARC打开的项目中的目标C 有没有人遇到过这种泄漏并知道如何防止 下面是执行查找的代码段,它与上述项目中的所有步骤相同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
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。
如果(结果){
发布(结果);
}
}
网络中似乎有很多东西泄漏。我有,这是另一个与代理相关的问题。