Malloc Crash al crear UIImage?

Sé que es un poco general, pero hicimos CADA posible para encontrar lo que es, y simplemente no pudimos.

Tenemos este locking que ocurre aquí y allá, no siempre, en esta línea:

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

El logging de locking dice:

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

Como puede ver, y en nuestro control, los data no son nulos cuando estamos creando la image, también lo hemos intentado con: [UIImage initWithData:data]; sin asignación, pero lo mismo.

EDITAR: así es como se ve el código después de esta fila:

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

Es probable que sus data se publiquen demasiado en otro hilo. El doble libre indica un desequilibrio de gestión de memory, no un puntero nulo.

Si tuviera que pnetworkingecir el problema, supongo que está generando data de un puntero inseguro, tal vez el resultado de una llamada de NSData , o un NSData sobre una memory mallocada que se libera detrás de su espalda. Así es como funciona mi teoría:

  • Usted crea el NSData sobre la memory insegura
  • Usted crea este bloque de operación, que pone una retención en el NSData
  • En algún otro lugar, liberas la memory subyacente
  • El bloque de operaciones se ejecuta
  • Esta es la última línea que usa data
  • ARC nota eso y, por lo tanto, libera data en el punto y coma
  • Liberar data lleva a un free()
  • La memory ya había sido liberada por otra persona.
  • Choque

La key es que NSData normalmente debería ser el único propietario de su memory; si no es así, debe tener mucho cuidado, especialmente en operaciones con varios subprocesss.