В настоящее время я пытаюсь написать приложение, используя внешнюю библиотеку с открытым исходным кодом. У меня есть исходный код, доступный для него, и при необходимости можно создать новую копию.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;
}
EDIT4: Оригинальное решение на самом деле работает, XCode отказался загрузить новую версию моей каркас, хотя я продолжал перекомпилировать его. Поэтому мне пришлось очистить все ссылки на фреймворк - включая очистку информационных страниц Build и повторное добавление «исправленной» версии.
Запустите анализатор кода. Сообщает ли он о каких-либо проблемах с вашим кодом? Если это так, исправьте проблемы, а затем проверьте, есть ли у вас утечка. – rmaddy
Эй, rmaddy, я только что провел анализ моего проекта. Единственные ошибки, которые возникают, вращаются вокруг идентификаторов прототипов ячеек и заставки (из-за моего неполного раскадровки). Мой проект по-прежнему очень неполный и небольшой, и я решил, что должен выполнить «очистку кода» и обзор, прежде чем продолжить следующий большой кусок. Вот как я обнаружил эту очень небольшую утечку памяти. –
Испытываете ли вы на симуляторе или на реальном устройстве? Тестирование на реальных устройствах выполняется только. – rmaddy