2011-04-09 46 views
2

我一直在研究一些獲取圖像像素的代碼,修改它們然後返回圖像。當我在樂器中運行時,它表示在標有★的代碼行上有泄漏。下面的代碼只是返回沒有任何修改的原始像素:內存泄漏與UIImage像素?

CFDataRef CopyImagePixels(CGImageRef inImage) { 
return CGDataProviderCopyData(CGImageGetDataProvider(inImage)); } 

- (UIImage *) imagePixels:(UIImage*)imge { 

CGImageRef img=imge.CGImage; 
CFDataRef dataref=CopyImagePixels(img); 
UInt8 *data=(UInt8 *)CFDataGetBytePtr(dataref); 
int length=CFDataGetLength(dataref); 

for (int i = 0; i < length; i+=4) 
{ 
    UInt8 b_pixel = data[i]; 
    UInt8 g_pixel = data[i+1]; 
    UInt8 r_pixel = data[i+2]; 

    float outputRed = r_pixel; 
    float outputGreen = g_pixel; 
    float outputBlue = b_pixel; 

    data[i] = outputBlue; 
    data[i+1] = outputGreen; 
    data[i+2] = outputRed; 
} 
CFDataRef newData=CFDataCreate(NULL,data,length);★ 
CGDataProviderRef provider=CGDataProviderCreateWithCFData(newData);★ 
CGImageRef newImg=CGImageCreate(CGImageGetWidth(img),CGImageGetHeight(img),CGImageGetBitsPerComponent(img),★ 
           CGImageGetBitsPerPixel(img),CGImageGetBytesPerRow(img),CGImageGetColorSpace(img), 
           CGImageGetBitmapInfo(img),provider,NULL,true,kCGRenderingIntentDefault); 
UIImage*Result = [UIImage imageWithCGImage:newImg]; 
CGImageRelease(newImg); 
CGDataProviderRelease(provider); 
CFRelease(newData); 
CFRelease(dataref); 
return Result; } 

我不知道這是爲什麼出現。我試過尋找答案,但他們都沒有工作。

感謝

更新1 泄漏是由這種方法來:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
ImageView.image = [oimage imagePixels:ImageView.image]; } 

而且oimage被設置在這裏:

-(void)viewDidAppear:(BOOL)animated { 
mainDelegate = (PhotoAppDelegate *)[[UIApplication sharedApplication]delegate]; 

CGSize size = mainDelegate.CurrentImage.size; 
UIGraphicsBeginImageContext(size); 
[mainDelegate.CurrentImage drawInRect:CGRectMake(0,0,size.width ,size.height)]; 
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();//LEAK 
UIGraphicsEndImageContext(); 

int kMaxResolution = 300; 
CGImageRef imgRef = newImage.CGImage; 
CGFloat width = CGImageGetWidth(imgRef); 
CGFloat height = CGImageGetHeight(imgRef); 
CGRect bounds = CGRectMake(0, 0, width, height); 
if (width > kMaxResolution || height > kMaxResolution) { 
    CGFloat ratio = width/height; 
    if (ratio > 1) { 
     bounds.size.width = kMaxResolution; 
     bounds.size.height = bounds.size.width/ratio; 
    } 
    else { 
     bounds.size.height = kMaxResolution; 
     bounds.size.width = bounds.size.height * ratio; 
    } 
} 

CGSize newsize = CGSizeMake(bounds.size.width, bounds.size.height); 
UIGraphicsBeginImageContext(newsize); 
[newImage drawInRect:CGRectMake(0, 0, newsize.width, newsize.height)]; 

newImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
oimage = [newImage retain]; 
ImageView.image = oimage; } 

此外,在右側欄儀器,點擊一個物體在底部中央窗口的泄漏將顯示你在側邊欄裏的李nk來自你的代碼。

在此先感謝

+0

難道你返回的UIImage是越來越莫名其妙地泄露?保留在某處並迷路,永不離開?這將導致底層提供的數據泄露,但你會覺得泄漏會在這種情況下指出,泄漏的UIImage以及... – 2011-04-09 14:08:37

回答

1

您發佈不漏的代碼,所以這裏有一些場景。

  • 泄漏是在其他地方,你是錯誤地解釋泄漏的結果。
  • 沒有泄漏,你被錯誤地解釋泄漏的結果。
  • 泄漏是錯誤的(我還沒有看到這一點,但也許一些關於你的代碼混淆它)

當你說

當我在儀器運行它,它說 有上的代碼行泄漏...

你是什麼意思?據我所知,Leaks不能也不會告訴你一個特定的泄漏責任線,它會告訴你泄漏物體的歷史,並且你必須決定是否過度保留了泄漏物體或者釋放不足它。

如果你只有在對象的分配歷史一行(創建對象的),那麼你的問題將是下釋放,但沒有在你的代碼發佈的對象將有一個單線的歷史。

也許你可以張貼截圖?

+0

嗨, 我編輯的職位,並增加了更多的信息。我認爲泄漏實際上可能來自viewDidAppear?同時也發佈泄漏信息。 感謝您的幫助 – Jason 2011-04-12 05:25:55