Crash on + (UIImage *) imageWithData: escala de datos (NSData *): escala (CGFloat) en iOS 8 | EXC_BAD_ACCESS UNKNOWN o KERNEL_INVALID_ADDRESS

La caída de la parte superior 2 de mi aplicación se realiza en el método siguiente:

+ (UIImage *)imageWithData:(NSData *)data scale:(CGFloat)scale 

Hasta ahora, ha ocurrido más de 2000 veces y se manifiesta de forms ligeramente diferentes de acuerdo con los informes de fallos:

 EXC_BAD_ACCESS KERN_INVALID_ADDRESS at 0x00000004 Thread : Crashed: com.apple.main-thread 0 ImageIO 0x27b6a1b6 CGImagePlusSetImageBlockProc + 41 1 libsystem_malloc.dylib 0x34a5139b calloc + 58 2 ImageIO 0x27b671c5 initImagePng + 4492 3 ImageIO 0x27b65a2f makeImagePlus + 930 4 ImageIO 0x27b65271 CGImageSourceCreateImageAtIndex + 160 5 UIKit 0x2a1e0bf3 _UIImageRefFromData + 262 6 UIKit 0x2a32d191 -[UIImage(UIImagePrivate) _initWithData:preserveScale:cache:] + 76 7 UIKit 0x2a1e0ae5 -[UIImage initWithData:] + 28 8 UIKit 0x2a2a36af -[UIImage initWithData:scale:] + 22 9 UIKit 0x2a32b721 +[UIImage imageWithData:scale:] + 56 EXC_BAD_ACCESS KERN_INVALID_ADDRESS at 0x00000000 Thread : Crashed: com.apple.main-thread 0 CoreFoundation 0x25bca41c CFArrayGetCount + 23 1 ImageIO 0x26c3898b getImagePlus + 118 2 ImageIO 0x26c3898b getImagePlus + 118 3 ImageIO 0x26c38433 makeImagePlus + 46 4 ImageIO 0x26c37fed CGImageSourceCreateImageAtIndex + 160 5 UIKit 0x292954c3 _UIImageRefFromData + 282 6 UIKit 0x293e1ad9 -[UIImage(UIImagePrivate) _initWithData:preserveScale:cache:] + 76 7 UIKit 0x292953a5 -[UIImage initWithData:] + 28 8 UIKit 0x29357ee7 -[UIImage initWithData:scale:] + 22 9 UIKit 0x293e0081 +[UIImage imageWithData:scale:] + 56 EXC_BAD_ACCESS UNKNOWN at 0x0000000104f44000 Thread : Crashed: com.apple.main-thread 0 libsystem_platform.dylib 0x0000000194795390 _platform_memmove + 320 1 libsystem_c.dylib 0x0000000194690424 __memcpy_chk + 32 2 libsystem_c.dylib 0x0000000194690424 __memcpy_chk + 32 3 ImageIO 0x0000000184a3172c _CGImageSourceBindToPlugin + 316 4 ImageIO 0x0000000184a31574 CGImageSourceGetCount + 112 5 UIKit 0x000000018816d46c _UIImageRefFromData + 276 6 UIKit 0x00000001882d1c20 -[UIImage(UIImagePrivate) _initWithData:preserveScale:cache:] + 112 7 UIKit 0x000000018823e21c -[UIImage initWithData:scale:] + 32 8 UIKit 0x00000001882cffa4 +[UIImage imageWithData:scale:] + 72 

No veo cómo mi código podría afectar esto, pero traté de enviar nada a este método y simplemente devuelve cero. ¿Podría un NSData dañado causar este locking? ¿Conserva este método el NSData? ¿Será porque el NSData se lanzó mientras esta línea se está procesando? No lo creo porque es sincrónico, ¿verdad?

Además de eso, no pude reproducir este error, pero dado que tenemos una gran base de usuarios, sucede a menudo. También noté que sucede el 99% de las veces en iOS 8.

Cualquier ayuda será muy apreciada.

¿Estás usando una biblioteca como AFNetwork o Hanekee? Acabo de enviar una request de extracción a ambas bibliotecas debido a ios8 UIImage imageWithData. Parece que UIImage con los datos NO es seguro para subprocesss, lo que significa que llamarlo de forma simultánea desde diferentes subprocesss se bloqueará … Una forma de replicar esto es probar el siguiente código:

 let data = NSData(contentsOfURL: NSURL(string: "https://encrypted-tbn3.gstatic.com/images?q=tbn:ANd9GcTf4P0V2TrszykwPguyeulcSt4vwQPcvvWKKq_RePhUUVFoHevG9lw8GVcw")!) var test: Array<UIImage> = [] let lock = NSLock() for i in 0...10000 { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { () -> Void in NSLog("Processing \(i)") let a = UIImage(data:data!) NSLog("Processed \(i)") lock.lock() test.append(a!) test.removeLast() lock.unlock() }) 

Por lo tanto, asegúrese de sincronizar las llamadas UIImage (datos: datos!) O [UIImage imageWithData: data] para evitar llamadas simultáneas.

Peticiones de extracción:

Haneke: https://github.com/Haneke/HanekeSwift/pull/207

AFNetwork: https://github.com/AFNetworking/AFNetworking/pull/2815