Je lis fichier PDF, puis le relâcher:iOS noyau graphique problème de gestion de la mémoire PDF
CFURLRef pdfURL = CFBundleCopyResourceURL(CFBundleGetMainBundle(), (CFStringRef)@"somepdf.pdf", NULL, NULL);
CGPDFDocumentRef pdf = CGPDFDocumentCreateWithURL((CFURLRef)pdfURL);
int pagesCount = CGPDFDocumentGetNumberOfPages(pdf);
CGPDFDocumentRelease(pdf);
Mais la mémoire n'est pas libéré après la libération (vérifié que avec des instruments). Pourquoi? Ce qui me manque dans la gestion de la mémoire.
Merci.
EDIT
voici mon code:
- (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
est variable d'instance. TiledPDFView
- est extrait de l'exemple ZoomingPDFViewer. il dessine CGPDFPageRef
en utilisant CATiledLayer
. Après l'appel tests
méthode, la vue est supprimée (devient invisible), mais la mémoire allouée avec CGPDFDocumentCreateWithURL
n'est pas libérée.
'CGPDFDocumentGetNumberOfPages' renvoie un' size_t', pas un 'int'. 'size_t' est non signé, alors que' int' est signé, et 'size_t' peut être plus grand (en octets, et donc à portée) que' int'. Méfiez-vous des grands documents qui ont des nombres de pages apparemment négatifs (en fait seulement très grands), ou qui ont effectivement des nombres aléatoires de pages (quand 'size_t' est plus grand que' int' et votre nombre est si grand qu'il dépasse 'int', donc une partie du nombre est supprimée). Vous devriez toujours utiliser le type correct pour les valeurs avec lesquelles vous travaillez. –
Merci Peter, je vais le réparer. – negersiu