2015-11-14 37 views
13

Uygulamam, kullanıcıların Fotoğraflar çerçevesini kullanarak fotoğrafları düzenlemelerine olanak tanır. Bazı kilitlenme raporları görüyorum ve çıktı görüntüsünü oluştururken kilitlenme ortaya çıkıyor, ancak sorunun nerede yattığından emin değilim. Bu kilitlenme, birden çok donanım aygıtında ve en son 9.1 dahil olmak üzere iOS 9'un birden çok sürümünde gerçekleşiyor. Uyguladığım son çağrı NSData düzenlenmiş görüntü oluşturmak için CGImageDestinationFinalize olduğunu. Kilitlenme raporları, çağrıların GLTextureManager gibi görünen bir kilitlenme gerçekleşmeden CoreImage alanında devam ettiğini gösteriyor.Crash upon CGImageDestinationFinalize

Bu sorun yetersiz olabilir mi? Sorunu görüyor musun? Bu nasıl çözülebilir? QOS_CLASS_UTILITY bir arka plan kuyruğunda çalışıyorsa editSingleAsset gelen denir fonksiyonu fullImageOutput içindeki PhotoEditor.swift den

İlgili kod:

enter image description here

Kilitlenme raporu ayrıntıları: çarpışma raporunun

let outputPhoto = //the generated CIImage that is the edited photo to be saved to disk 
let dataRef = CFDataCreateMutable(nil, 0) 

if let destination = CGImageDestinationCreateWithData(dataRef, "public.jpeg", 1, nil) { 
    struct ContextStruct { 
     static var ciContext: CIContext? = nil 
    } 
    if ContextStruct.ciContext == nil { 
     let eaglContext = EAGLContext(API: .OpenGLES2) 
     ContextStruct.ciContext = CIContext(EAGLContext: eaglContext) 
    } 
    let cgImage = ContextStruct.ciContext!.createCGImage(outputPhoto, fromRect: outputPhoto.extent) 

    CGImageDestinationAddImage(destination, cgImage, nil) 

    if CGImageDestinationFinalize(destination) { //FIXME: CRASH 
     //write to disk from dataRef etc 
    } 

} 

Görselleştirme:

Exception Type: EXC_BAD_ACCESS (SIGSEGV) 
Exception Subtype: KERN_INVALID_ADDRESS at 0x0000000145201ac0 
Triggered by Thread: 7 

Thread 7 name: 
Thread 7 Crashed: 
0 libsystem_platform.dylib  0x0000000199e36220 _platform_memmove + 48 (memmove.s:220) 
1 CoreImage      0x0000000184e86e4c CI::GLTextureManager::texture_for_CGImage(CGImage*, CI::PixelFormat) + 372 (context-gles.cpp:910) 
2 CoreImage      0x0000000184e8a310 CI::GLContext::bind_textures(CI::SerialObjectPtrArray*, CI::Kernel*) + 240 (context-gles.cpp:3060) 
3 CoreImage      0x0000000184e899e0 CI::GLContext::render_apply_node(CI::Node const*, bool) + 160 (context-gles.cpp:2699) 
4 CoreImage      0x0000000184e897fc CI::GLContext::recursive_render(CI::Node*, bool) + 912 (context-gles.cpp:2379) 
5 CoreImage      0x0000000184e8a788 CI::GLContext::render(CI::Node*) + 180 (context-gles.cpp:2880) 
6 CoreImage      0x0000000184e9bfec CI::_get_bitmap(CI::Context*, CI::Image*, CGRect, CGColorSpace*, CI::Bitmap*) + 676 (render.cpp:2622) 
7 CoreImage      0x0000000184e9bc9c CI::image_get_bitmap(CI::Context*, CI::Image*, CGRect, CGColorSpace*, CI::Bitmap*, unsigned long) + 664 (render.cpp:2680) 
8 CoreImage      0x0000000184ea08e8 copyImageBlockSetOptsCallback(void*, CGImageProvider*, CGRect, CGSize, __CFDictionary const*) + 856 (imageProvider.h:143) 
9 CoreGraphics     0x0000000184af2198 CGImageProviderCopyImageBlockSet + 220 (CGImageProvider.c:500) 
10 ImageIO       0x0000000185baa41c GetBytesImageProvider + 484 (CGImagePixelDataProvider.c:382) 
11 ImageIO       0x0000000185c40440 _CGImagePluginWriteAppleJPEG + 2444 (imageAppleJPEG.c:2785) 
12 ImageIO       0x0000000185ba3020 CGImageDestinationFinalize + 724 (CGImageDestination.c:2119) 
13 MyAppNameHere     0x0000000100096468 _TFC11 MyAppNameHere 12PhotoEditor15fullImageOutputfS0_FT_GSqCSo22PHContentEditingOutput_ + 1272 (PhotoEditor.swift:71) 
14 MyAppNameHere     0x0000000100113310 _TFFFFFC11 MyAppNameHere 36PhotosPickerCollectionViewController16editSingleAssetFS0_FCSo7PHAssetT_U_FT_T_U0_FTGSqCSo21PHContentEditingInput_GVSs10DictionaryCSo8NSObjectPSs9AnyObject___T_U_FT_T_U_FT_T_ + 172 (PhotosPickerCollectionViewController.swift:851) 
15 libdispatch.dylib    0x0000000199c296e8 _dispatch_call_block_and_release + 24 (init.c:761) 
16 libdispatch.dylib    0x0000000199c296a8 _dispatch_client_callout + 16 (object.m:513) 
17 libdispatch.dylib    0x0000000199c37b40 _dispatch_root_queue_drain + 2140 (inline_internal.h:1063) 
18 libdispatch.dylib    0x0000000199c372dc _dispatch_worker_thread3 + 112 (queue.c:4250) 
19 libsystem_pthread.dylib   0x0000000199e3d470 _pthread_wqthread + 1092 (pthread.c:1990) 
20 libsystem_pthread.dylib   0x0000000199e3d020 start_wqthread + 4 (pthread_asm.s:191) 
+0

Neden CGImageDestinationFinalize öğesinin güvenli olduğunu umalım? Sonlandırmak için ana konuya geçerseniz, çarpışma gider mi? – matt

+0

@matt Bu kilitlenmeyi kendim yapamıyorum, ancak ana kuyrukta sonlandırma yeni bir çökmeye neden olmaz ancak ana iş parçacığının engellenmesine neden olur - kullanıcının devam eden işlemi iptal etmesi engellenir . – Joey

+0

@matt Apple'ın SquareCam örnek kodunda, benzer bir şey yapar ve oluşturdukları bir seri sıraya göre 'CGImageDestinationFinalize' çağrısı yapar. – Joey

cevap

0

Bu iOS 10'da iOS 10'da çözülen bilinen bir sorundu. Kaynak kodunda bir sorun yok.