CFString内存泄漏

我已将内存泄漏缩小到以下代码

CFStringRef CFDataToString(CFDataRef data) { UInt8* buf = malloc(CFDataGetLength(data)); CFDataGetBytes(data, CFRangeMake(0, CFDataGetLength(data)), buf); CFMutableStringRef output = CFStringCreateMutable(kCFAllocatorDefault, CFDataGetLength(data) * 2); for(int i = 0; i < CFDataGetLength(data); i++) { CFStringAppendFormat(output, NULL, CFSTR("%02x"), buf[i]); } free(buf); CFRelease(data); return output; } 

下面是上下文中使用的代码,一些方法已经过简化以进行演示。 Instruments报告了CFStringCreateMutableCFStringAppendFormat的内存泄漏。

 CFStringRef CFDataToString(CFDataRef data) { UInt8* buf = malloc(CFDataGetLength(data)); CFDataGetBytes(data, CFRangeMake(0, CFDataGetLength(data)), buf); CFMutableStringRef output = CFStringCreateMutable(kCFAllocatorDefault, CFDataGetLength(data) * 2); for(int i = 0; i < CFDataGetLength(data); i++) { CFStringAppendFormat(output, NULL, CFSTR("%02x"), buf[i]); } free(buf); CFRelease(data); return output; } CFDataRef hmac(CFStringRef key, CFStringRef data) { const char *cKey = CFStringGetCStringPtr(key, CFStringGetSystemEncoding()); const char *cData = CFStringGetCStringPtr(data, CFStringGetSystemEncoding()); unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH]; CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC); CFDataRef HMAC = CFDataCreate(kCFAllocatorDefault, cHMAC, sizeof(cHMAC)); return HMAC; } CFDictionaryRef buildRequest(CFMutableDictionaryRef params) { CFMutableStringRef signature = CFStringCreateMutable(NULL, 0); CFStringAppend(signature, CFDataToString(hmac(CFSTR("mykey"), CFSTR("mydata")))); CFDictionarySetValue(params, CFSTR("signature"), signature); // .... // .... return params; } void request(CFMutableDictionaryRef params) { params = buildRequest(params); // ... Run request CFRelease(params); } 

仪器输出……

在此处输入图像描述

在此处输入图像描述

再一次作为答案。

使用Create方法分配的所有数据都将释放数据的责任交给程序员。 在这方面,它与调用malloc相同。 除非文档中明确说明,否则任何方法都不会发布此数据。

要解决您的问题,请在接收它的方法中保存对“已创建”(已分配)数据的引用,并在完成该方法后在方法结束时将其释放。