在创建UIImage时Malloc Crash?

时间:2014-11-06 10:20:57

标签: ios objective-c 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();
      }

1 个答案:

答案 0 :(得分:3)

你的data很可能在另一个帖子上被过度释放。 double-free表示内存管理不平衡,而不是nil-pointer。

如果我必须预测问题,我猜你是从一个不安全的指针生成data,可能是CoreGraphics调用的结果,或者是一个{mallis'ed内存的NSData在你背后得到释放。以下是我的理论的工作原理:

  • 您创建了NSData over unsafe memory
  • 您创建此操作块,该保留在NSData
  • 在其他地方,你释放了底层记忆
  • 操作块运行
  • 这是使用data
  • 的最后一行
  • ARC注意到,因此以分号
  • 发布data
  • 发布data会导致free()
  • 内存已被其他人释放
  • 崩溃

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