2011-04-09 66 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