【问题标题】:Malloc Crash when creating UIImage?创建 UIImage 时 Malloc 崩溃?
【发布时间】:2014-11-06 10:20:57
【问题描述】:

我知道它有点笼统,但我们尽一切可能找到它是什么,但我们就是做不到。

我们在这条线上时不时会发生这种崩溃,但并非总是如此:

[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 在我们创建图像时不是 nil,我们还尝试了:[UIImage initWithData:data]; without allocation,但同样的事情。

编辑: 这是该行之后代码的样子:

       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();
      }

【问题讨论】:

标签: ios objective-c uiimage


【解决方案1】:

您的data 可能在另一个线程上被过度释放。 double-free 表示内存管理不平衡,而不是零指针。

如果我不得不预测这个问题,我猜你是从一个不安全的指针生成data,可能是 CoreGraphics 调用的结果,或者是 NSData 在 malloc 的内存上被释放的结果背部。我的理论是这样运作的:

  • 您在不安全的内存上创建了NSData
  • 您创建了这个操作块,它将保留在NSData
  • 在其他地方,您可以释放底层内存
  • 操作块运行
  • 这是使用data 的最后一行
  • ARC 注意到这一点,因此在分号处释放 data
  • 释放data 导致free()
  • 内存已被其他人释放
  • 崩溃

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

【讨论】:

  • 谢谢-请检查我的编辑:没错,在那之后我确实使用了核心图形,但崩溃表明它是那条线。那么,底线我将如何更改此代码以阻止这种情况发生?每次我想从服务器加载 4 个下一个图像时,我都会使用这个块(常规延迟加载)
  • @Curnelious - 当你到达失败的线时为时已晚。
  • 错误可能不在这里。大概是在生成数据然后调用this的代码中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-13
  • 1970-01-01
  • 2019-08-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多