2014-10-09 106 views
0

我知道這個問題以前曾被問過,但似乎沒有任何工作。CGImageRef沒有在ARC下發布

我有一個返回使用CIImageCGIImage一個濾波後的圖像的一個靜態方法中,我使用上RayWenderlich.com實施例和改變了它返回一個UIImage的,而不是直接將其設置爲一個的UIImageView的。

我的問題是CGImageRef cgimg永遠不會被釋放。這導致相當快速的內存泄漏。我究竟做錯了什麼?

+ (UIImage *)image:(UIImage *)image withFilterName:(NSString *)filterName 
{ 
    if (!image) 
     return nil; 


    @autoreleasepool { 
     CIImage *beginImage = [[CIImage alloc] initWithCGImage:image.CGImage]; 

     CIContext *context = [CIContext contextWithOptions:nil]; 

     CIFilter *filter = [CIFilter filterWithName:@"CIPhotoEffectProcess"] 
     [filter setValue:beginImage forKey:kCIInputImageKey]; 

     CIImage *outputImage = [filter outputImage]; 

     CGImageRef cgimg = [context createCGImage:outputImage fromRect:[outputImage extent]]; 

     UIImage *newImage = [UIImage imageWithCGImage:cgimg]; 

     CGImageRelease(cgimg); 

     return newImage; 
    } 
} 
+0

我只是在這裏猜測,但因爲CGImageRef不是NSObject的子類(因此沒有'retain'和'release'選擇器),我很確定ARC不會計算它。 – 2014-10-09 14:32:07

+1

我沒有看到您發佈的代碼有任何問題。你用'newImage'做什麼? – 2014-10-09 14:40:35

回答

0

看起來像cgimg正在發佈。我假設你的意思是CGImage未被釋放。你不會指望它,因爲你將它傳遞給UIImage,這可能會保留它。

最有可能你後來泄漏UIImage(或保持它當你不是故意的,這是類似的泄漏)。我會審覈您使用的地方的代碼併發布UIImage,而CGImageRef可能會自行處理。