Tag: 核心基础

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报告了CFStringCreateMutable和CFStringAppendFormat的内存泄漏。 CFStringRef CFDataToString(CFDataRef data) { UInt8* buf = malloc(CFDataGetLength(data)); CFDataGetBytes(data, CFRangeMake(0, CFDataGetLength(data)), buf); CFMutableStringRef output […]

在Core Foundation中保留和“自动释放”

假设我正在编写自己的函数,该函数接收CFDataRef对象,对其执行某些操作,并返回另一个CFDataRef对象: CFDataRef transformData(CFDataRef inData) { //Question 1: Should I call CFRetain(data) here to make sure it doesn’t //go away? (This of course would involve releasing data just before returning //from this function, or as soon as I no longer need data.) CFDataRef outData; //Somehow produce the new outData from inData (and assume we are the […]

内存管理:NSString的stringWithCString:编码:

假设我从某个函数中获取了一个C字符串: char * mystring = SomeCFunction(…); 我拥有这个字符串(当我完成时,我负责释放它)。 如果,在Objective-C中,我使用以下命令创建NSString * : NSString * mynsstring = [NSString stringWithCString:mystring encoding:NSUTF8StringEncoding]; 我还有责任释放原来的C字符串吗? 我假设答案是肯定的,但我在文档中找不到明确的答案 – 而相反方法( cStringUsingEncoding )的function虽然很明显,但确实让我暂停,因为它为你处理了cString释放。 如果答案是肯定的,那么我还要负责确保在使用NSString *之前我没有释放c字符串,或者该函数是否为我复制字符串? 我问这个是因为stringWithCString的文档说: 返回包含给定C数组中的字节的字符串,根据给定的编码进行解释。 这仍然让我想知道它是否真的复制了字节,或者只是在内部指向它们(我基本上只是在做一个演员)。

ABRecordSetValue返回的CFErrorRef的内存管理

考虑一些涉及error handling的典型CF代码,比如说: ABRecordRef aRecord = ABPersonCreate(); CFErrorRef anError = NULL; ABRecordSetValue(aRecord, kABPersonFirstNameProperty, CFSTR(“Joe”), &anError); 在此代码之后如何处理anError ? 我是否必须保留它,以确保它不会消失,然后再释放它? 或者我已经是主人了,我只需要稍后发布它?