0

Ich versuche, einige CoreGraphics/CoreImage-Manipulation innerhalb einer NSOperation mit MacRuby zu tun. Ich habe ein paar API-Aufrufe, die eine Quelldatei in CG lesen und ein CGImageDestination einrichten.EXC BAD ACCESS von CoreGraphics API in NSOperation

Wenn ich den folgenden Code in ein NSOperation.init setzen, alles funktioniert gut:

@dest = CGImageDestinationCreateWithURL(@photo.output_url, "public.jpeg" , 1, nil); 
@context = CIContext.alloc.init 

@cgOriginalImgSrc = CGImageSourceCreateWithURL(@photo.url, nil) 
@cgOriginal  = CGImageSourceCreateImageAtIndex(@cgOriginalImgSrc, 0, nil)  

Aber wenn ich den gleichen Code in die Hauptfunktion für die NSOperation setzen, bekomme ich sporadisch EXC_BAD_ACCESS Fehler. Und nur wenn die NSOperation an eine NSOperationQueue übergeben wird; Wenn ich selbst main anrufe, funktioniert es gut.

Am Ende des Hauptes Ich betreiben:

CFRelease(@dest)  
CFRelease(@cgOriginalImgSrc) 
CGImageRelease(@cgOriginal) 

Noch seltsamer ist, dass er in init funktioniert, auch wenn init nicht von dem Haupt-Thread aufgerufen wird (also nicht ein Haupt-Thread/Hintergrund-Thread Ausgabe, ich rate)

Irgendwelche Gedanken?

Antwort

1

Sieht aus wie einer Ihrer Threads auf ein Objekt verweist, das nicht mehr im Speicher vorhanden ist. Versuchen Sie zu entfernen

CFRelease(@dest)  
CFRelease(@cgOriginalImgSrc) 
CGImageRelease(@cgOriginal) 

Und sehen, wie es geht. Sie können auch versuchen, Ihre Objekte in jeder Warteschlange zu überprüfen, um zu sehen, ob sie noch verfügbar sind. Schließlich könnten Sie macrubyd, den Debugger für MacRuby verwenden, um zu sehen, was vor sich geht, oder sogar GDB verwenden und das Backtrace einfügen, damit wir sehen können, was das Problem ist.

Danke,

  • Matt