2014-11-06 91 views
4

我知道它有点泛泛,但是我们做了一切可能的事情来找到它是什么,而我们却做不到。Malloc创建UIImage时崩溃?

我们有这样的崩盘发生在这里和那里,并非总是如此,在这条线:

[self.imageOperationQueue addOperationWithBlock:^ 
{ 
    if(!data) 
     return ; 
    UIImage *image=[[UIImage alloc] initWithData:data]; // *** CRASH ! 

崩溃日志说:

malloc: *** error for object 0x7fecdb06e5c0: double free 
*** set a breakpoint in malloc_error_break to debug 

正如你所看到的,并在我们的检查, data不是零,当我们创建图像时,我们也尝试过:[UIImage initWithData:data];没有分配,但同样的事情。

编辑: 这是怎样的代码看起来像这样一行之后:

 if(!data) 
      return ; 


     UIImage *image=[[UIImage alloc] initWithData:data]; 
     UIImageView *modelview=[self.allImageView objectAtIndex:index]; 
     float newH=image.size.height* (1.65*modelview.frame.size.width/image.size.width); 
     CGSize s=CGSizeMake(1.65*modelview.frame.size.width, newH); 

     if (image) 
     { 
      UIGraphicsBeginImageContextWithOptions(s , NO, 0.0); 
      [image drawInRect:CGRectMake(0, 0, s.width, s.height)]; 

      image = UIGraphicsGetImageFromCurrentImageContext(); 
      UIGraphicsEndImageContext(); 
     } 
+0

是的,在malloc_error_break中设置一个断点来调试和启用僵尸 – Lefteris 2014-11-06 10:24:33

+0

http://stackoverflow.com/questions/10587266/double-free-set-a-breakpoint-in-malloc-error-break-to-debug-在弧中通过这个链接。 – BHUMICA 2014-11-06 11:03:50

+0

何不干脆[UIImage的页头] initWithData:data.copy],看看它是如何去 – 2014-11-06 13:00:07

回答

3

data很可能被过度释放另一个线程。双免费表示内存管理不平衡,而不是无指针。

如果让我预测的问题,我猜你从一个不安全的指针,一个CoreGraphics中调用的可能的结果,或在NSData得到那你背后释放malloc分配的内存产生data。这里是我的理论是如何工作的:

  • 您在不安全的存储创建NSData
  • 创建这个操作块,这使在NSData
  • 别的地方一个保留,你释放底层的内存
  • 的操作块运行
  • 这是最后一行使用data
  • ARC注意到并因此释放data在半圆形在
  • 释放data通向free()
  • 内存已经由别人
  • 崩溃中解脱出来

的关键是NSData通常应该是其存储的唯一所有者;如果不是,那么你必须非常小心,特别是在多线程操作中。

+0

谢谢 - 请检查我的编辑:你对我之后使用核心图形,但崩溃显示它的那一行。所以,底线我如何改变这段代码来阻止这种情况发生?每当我想从服务器上加载4张下一张图片时,我都会使用这个块(经常延迟加载) – Curnelious 2014-11-06 12:50:55

+1

@Curnelious - 当你遇到失败的行时,就太迟了。 – 2014-11-06 12:53:24

+0

错误可能不在这里。它可能在代码中生成数据然后调用它。 – 2014-11-07 14:39:26