我知道它有点普遍,但我们做了很多事情来找到它是什么,我们就是不可能。
我们在这一线上发生了这种崩溃,并非总是如此:
[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 :(得分:3)
你的data
很可能在另一个帖子上被过度释放。 double-free表示内存管理不平衡,而不是nil-pointer。
如果我必须预测问题,我猜你是从一个不安全的指针生成data
,可能是CoreGraphics调用的结果,或者是一个{mallis'ed内存的NSData
在你背后得到释放。以下是我的理论的工作原理:
NSData
over unsafe memory NSData
data
data
data
会导致free()
关键是NSData
通常应该是其记忆的唯一所有者;如果不是,那么你必须非常小心,特别是在多线程操作中。