2015-09-12 4 views
0

В настоящее время я пытаюсь написать приложение, используя внешнюю библиотеку с открытым исходным кодом. У меня есть исходный код, доступный для него, и при необходимости можно создать новую копию.iOS Core Foundation Утечка памяти во внешней библиотеке

В любом случае, профилируя мое приложение, я заметил, что в библиотеке протекает некоторая память. Он маленький - 128b выстрел - но все же, я бы предпочел не, чтобы иметь утечки памяти для начала.

Вот код. Модифицированный код, который я написал, находится сверху (это утечка), а исходный код находится внизу (это утечка).

CFURLRef getURLFromPath(const char * path) { 
    //modified code to hopefully clean up after myself 
    CFStringRef cfTotalPath = CFStringCreateWithCString (NULL, path, kCFStringEncodingUTF8); 
    CFURLRef cURL = CFURLCreateWithFileSystemPath(NULL, cfTotalPath, kCFURLPOSIXPathStyle, false); 
    CFRelease(cfTotalPath); 

    return cURL; 

    //original code 
    /*CFStringRef cfTotalPath = CFStringCreateWithCString (kCFAllocatorDefault, 
     path, kCFStringEncodingUTF8); 

    return CFURLCreateWithFileSystemPath(kCFAllocatorDefault, cfTotalPath, 
     kCFURLPOSIXPathStyle, false);*/ 

} 

Я относительно новичок в программировании на iOS; Я отлаживаю фактическое устройство, и я знаю, что иногда инструменты дают ложные срабатывания, когда дело доходит до утечек.

Это бесит, потому что этот один блок кода является последним шагом в трассировке стека для моих утечек ... и я честно не знаю, как это исправить.

EDIT: Из того, что я читал, Apple не против случайной утечки памяти здесь и там; Я продолжу программирование, потому что этот процесс происходит только один раз на музыкальный файл в моем приложении - анализ трека для BPM (он сохраняется после анализа).

Редактировать2: Вот со ссылкой. Я добавил все CFRelease (fileURL), но до сих пор просачивается:

uint_t aubio_sink_apple_audio_open(aubio_sink_apple_audio_t *s) { 

    if (s->samplerate == 0 || s->channels == 0) return AUBIO_FAIL; 

    AudioStreamBasicDescription clientFormat; 
    memset(&clientFormat, 0, sizeof(AudioStreamBasicDescription)); 
    clientFormat.mFormatID   = kAudioFormatLinearPCM; 
    clientFormat.mSampleRate  = (Float64)(s->samplerate); 
    clientFormat.mFormatFlags  = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked; 
    clientFormat.mChannelsPerFrame = s->channels; 
    clientFormat.mBitsPerChannel = sizeof(short) * 8; 
    clientFormat.mFramesPerPacket = 1; 
    clientFormat.mBytesPerFrame = clientFormat.mBitsPerChannel * clientFormat.mChannelsPerFrame/8; 
    clientFormat.mBytesPerPacket = clientFormat.mFramesPerPacket * clientFormat.mBytesPerFrame; 
    clientFormat.mReserved   = 0; 

    AudioFileTypeID fileType = kAudioFileWAVEType; 
    CFURLRef fileURL = getURLFromPath(s->path); 
    bool overwrite = true; 
    OSStatus err = noErr; 
    err = ExtAudioFileCreateWithURL(fileURL, fileType, &clientFormat, NULL, 
    overwrite ? kAudioFileFlags_EraseFile : 0, &s->audioFile); 
    if (err) { 
    char_t errorstr[20]; 
    AUBIO_ERR("sink_apple_audio: error when trying to create %s with " 
     "ExtAudioFileCreateWithURL (%s)\n", s->path, 
     getPrintableOSStatusError(errorstr, err)); 
    goto beach; 
    } 
    if (createAubioBufferList(&s->bufferList, s->channels, s->max_frames * s->channels)) { 
    AUBIO_ERR("sink_apple_audio: error when creating buffer list for %s, " 
     "out of memory? \n", s->path); 
    goto beach; 
    } 

    //added release code 
    CFRelease(fileURL); 
    return AUBIO_OK; 

beach: 
    //added release code 
    CFRelease(fileURL); 
    return AUBIO_FAIL; 
} 

EDIT3: Вот скриншот Instrument panel

EDIT4: Оригинальное решение на самом деле работает, XCode отказался загрузить новую версию моей каркас, хотя я продолжал перекомпилировать его. Поэтому мне пришлось очистить все ссылки на фреймворк - включая очистку информационных страниц Build и повторное добавление «исправленной» версии.

+0

Запустите анализатор кода. Сообщает ли он о каких-либо проблемах с вашим кодом? Если это так, исправьте проблемы, а затем проверьте, есть ли у вас утечка. – rmaddy

+0

Эй, rmaddy, я только что провел анализ моего проекта. Единственные ошибки, которые возникают, вращаются вокруг идентификаторов прототипов ячеек и заставки (из-за моего неполного раскадровки). Мой проект по-прежнему очень неполный и небольшой, и я решил, что должен выполнить «очистку кода» и обзор, прежде чем продолжить следующий большой кусок. Вот как я обнаружил эту очень небольшую утечку памяти. –

+0

Испытываете ли вы на симуляторе или на реальном устройстве? Тестирование на реальных устройствах выполняется только. – rmaddy

ответ

1

Вы утечка возвращаемого CFURLRef, созданного с помощью CFURLCreateWithFileSystemPath.

Вы должны переименовать функцию от getURLFromPath до createURLFromPath, чтобы указать, что право собственности на возвращенный CFURLRef передается вызывающему абоненту. Тогда любой код, вызывающий метод, отвечает за освобождение CFURLRef, когда он сделан.

+0

Благодарим за помощь; Я добавил CFRelease (fileURL) в код, который его вызывает, но я все еще испытываю ссылки. Я добавил код вызова к моему первоначальному вопросу. –

+0

Эй, rmaddy! Ваше решение закончилось работой; несмотря на мои сборки и чистки, XCode продолжал кэшировать старую версию фреймворка.В итоге мне пришлось удалить все ссылки на библиотеку (включая удаление ссылок на папки из путей поиска в каркасе) и считывание нового. Что было аккуратно, однако, что инфраструктура была также обновлена ​​с 0,41 до 0,42, поэтому я получил бесплатное обновление исправления ошибок! –

 Смежные вопросы

  • Нет связанных вопросов^_^