2010-10-08 3 views
2

Я пишу CGImageRef с помощью метода Path. Это:Сборщик мусора и основная графика

- (CGImageRef)createImage:(NSString*)path 
{ 
    // Create NSURL 
    NSURL *url = [NSURL fileURLWithPath:path]; 
    CFURLRef cfURL = (CFURLRef)url; 

    // Create image from source 
    CGImageRef image = NULL; 
    CGImageSourceRef imageSource = NULL; 
    imageSource = CGImageSourceCreateWithURL(cfURL, NULL); 
    if(imageSource != NULL) { 
     image = CGImageSourceCreateImageAtIndex(imageSource, 0, NULL); // LEAK 
     CFRelease(imageSource); 
    } else { 
     NSLog(@"Could not load image"); 
     return NULL; 
    } 

    // Scale Image 
    if(image != NULL) { 
     // Create context 
     CGRect rect = CGRectMake(0.0f, 0.0f, CGImageGetWidth(image), CGImageGetHeight(image)); 
     CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); 
     CGContextRef context = CGBitmapContextCreate(NULL, rect.size.width, 
               rect.size.height, 8, 0, 
               colorSpace, 
               kCGImageAlphaPremultipliedFirst); 
     CGContextSetInterpolationQuality(context, kCGInterpolationHigh); 
     CGContextDrawImage(context, rect, image); // LEAK 
     CGContextFlush(context); 
     CGColorSpaceRelease(colorSpace); 
     CGImageRelease (image); 

     // Create scaledImage 
    scaledImage = CGBitmapContextCreateImage(context); // LEAK 
    image = scaledImage; 
    CGContextRelease (context); 
    } 

    return image; 
    } 

У меня включен сборщик мусора. Когда я использую Инструмент, я нахожу утечку в CGImageSourceCreateImageAtIndex, CGContextDrawImage и CGBitmapContextCreateImage. Где ошибка, пожалуйста? Как я должен управлять памятью в Core Graphics Когда я включаю сборщик мусора? Спасибо и извините мой английский.

ответ

0

Утечка, вероятно, происходит из-за того, что вы не выпускаете возвращаемый метод CGImageRef.

+0

Thank Dave. Я освобождаю CGImageRef. Утечка появляется в методе createImage. – Fernando

+1

Инструмент @Fernando the Leaks показывает, где была создана просочившаяся память, а не там, где она была потеряна. Другими словами, он показывает, что вы * то, что было просочилось, а не * где * было просочилось. –

+0

Если щелчок правой кнопкой (кнопки просмотра), я могу посмотреть трассировку стека. http://cl.ly/ebef2544db1817189bc1 В этой трассе стека я выгляжу что-то неправильно в моем методе createImage: http://cl.ly/60c121f7e38ea92431bb – Fernando