iOS Core Graphics Проблема управления памятью PDF

Я читаю файл PDF, а затем выпускаю его:

CFURLRef pdfURL = CFBundleCopyResourceURL(CFBundleGetMainBundle(), (CFStringRef)@"somepdf.pdf", NULL, NULL);
CGPDFDocumentRef pdf = CGPDFDocumentCreateWithURL((CFURLRef)pdfURL);    
int pagesCount = CGPDFDocumentGetNumberOfPages(pdf);
CGPDFDocumentRelease(pdf);

Но память после сброса не освобождается (проверил с помощью Инструментов). Почему? Чего мне не хватает в управлении памятью.

Спасибо.

РЕДАКТИРОВАТЬ

вот мой код:

- (void)loadView {
            [super loadView];
            CFURLRef pdfURL = CFBundleCopyResourceURL(CFBundleGetMainBundle(), (CFStringRef)@"some.pdf", NULL, NULL);
            pdf = CGPDFDocumentCreateWithURL((CFURLRef)pdfURL); 
            CFRelease(pdfURL);
            CGPDFPageRef pdfPage = CGPDFDocumentGetPage(pdf, 1);

            TiledPDFView * v = [[TiledPDFView alloc] initWithFrame:self.view.bounds andScale:1];
            [v setPage:pdfPage];

            [self.view addSubview:v];


            UIButton * but = [UIButton buttonWithType:UIButtonTypeRoundedRect];
            [but setTitle:@"removeView" forState:UIControlStateNormal];
            [but addTarget:self action:@selector(tests) forControlEvents:UIControlEventTouchDown];
            but.frame = CGRectMake(0, 0, 100, 40);
            [self.view addSubview:but];

    }

    -(void) tests {
        [self.view removeFromSuperview];
        [self.view release];
        CGPDFDocumentRelease(pdf);
    }

pdf — переменная экземпляра. TiledPDFView - это uiview из примера ZoomingPDFViewer. он рисует CGPDFPageRef, используя CATiledLayer.

после вызова метода tests представление удаляется (становится невидимым), но память, выделенная с помощью CGPDFDocumentCreateWithURL, не освобождается.


person negersiu    schedule 04.10.2010    source источник
comment
CGPDFDocumentGetNumberOfPages возвращает size_t, а не int. size_t не имеет знака, тогда как int является знаковым, а size_t может быть больше (в байтах и, следовательно, в диапазоне), чем int. Остерегайтесь больших документов с кажущимся отрицательным (на самом деле просто очень большим) числом страниц или с фактически случайным числом страниц (когда size_t больше, чем int, а ваше число настолько велико, что превышает диапазон int, поэтому часть часть номера обрезается). Вы всегда должны использовать правильный тип для значений, с которыми вы работаете.   -  person Peter Hosey    schedule 05.10.2010
comment
Спасибо, Петр, исправлю.   -  person negersiu    schedule 05.10.2010


Ответы (1)


Какая память не освобождается? Как вы сказали, вы должным образом выпустили CGPDFDocument, так что это должно было исчезнуть.

Ты уверен, что это не CFURL торчит поблизости? Вы не показываете, что публикуете это, но вы Скопировали это, так что вы обязаны. См. Руководство по управлению памятью для Core Foundation.

Вы можете использовать инструмент ObjectAlloc, чтобы определить, какие конкретные объекты остаются живыми. Установите начальную и конечную точки на временной шкале до того, как объект был создан, и после того, как он был освобожден, соответственно, затем установите инструмент, чтобы показать вам «Объекты, созданные и все еще живые». Вы также можете использовать инструмент Leaks, чтобы показать вам, какие объекты все еще живы, на которые у вас больше нет указателя. Оба инструмента изначально показывают разбивку по классам, в которой вы можете перейти к экземплярам, ​​а затем к событиям (выделения, удержания, автоматические выпуски, выпуски и освобождение).

person Peter Hosey    schedule 05.10.2010
comment
Память, выделенная с помощью CGPDFDocumentCreateWithURL, не освобождается (~3 МБ выделено и все еще используется). Я отредактировал свой код, о котором идет речь - person negersiu; 05.10.2010
comment
Разве вы не должны установить для свойства self.view значение nil, а не освобождать представление, которое вы все еще держите? Кроме того, вы проверили, что страница (которая, как я предполагаю, сохранена) была выпущена? - person Peter Hosey; 06.10.2010