Как вернуть CFDataRef без утечки памяти? [Ios] - PullRequest
3 голосов
/ 21 ноября 2011

Когда я возвращаю CFDataRef по

(CFDataRef)MyFunction{
    .....
    CFDataRef data = CFDataCreate(NULL, buf, bufLen);
    free(buf);
    return data;
}

Есть утечка памяти, как сделать CFDataRef авто-релиз?метод [autorelease данных] не завершается.

Ответы [ 2 ]

6 голосов
/ 21 ноября 2011

Вы не можете автоматически высвобождать объекты Core Foundation.(Однако вы можете автоматически высвобождать объекты Core Foundation, которые поддерживают бесплатное мостовое соединение, например CFDataRef; см. Ответ @ newacct ниже.)

Соглашение Objective-C состоит в том, чтобы называть ваш метод так, чтобы он начинался со слова new, чтобы указать, что вызывающая сторона ответственна за освобождение своего возвращаемого значения.Например:

+ (CFDataRef)newDataRef {
    return CFDataCreate(...);
}

CFDataRef myDataRef = [self newDataRef];
...
CFRelease(myDataRef);

Если вы соблюдаете это соглашение об именах, статический анализатор XCode правильно отметит проблемы управления памятью в Core Foundation.

2 голосов
/ 26 сентября 2012

как сделать авто-релиз CFDataRef? метод [авто-релиз данных] не выходит.

Просто приведите его к типу указателя объекта, чтобы вызвать autorelease:

-(CFDataRef)MyFunction{
    .....
    CFDataRef data = CFDataCreate(NULL, buf, bufLen);
    free(buf);
    return (CFDataRef)[(id)data autorelease];
}
...