Ich versuche, die SampleFTPExportPlugIn, die mit dem Aperture SDK 2.1 kommt zu laufen. Ich musste die Base SDK-Einstellung optimieren und manuell den Ordner "PluginManager.Framework" nach/Library/Frameworks kopieren, wie beschrieben here.Aperture Plug-in Abstürze mit EXC_BAD_ACCESS
Alle kompiliert und Aperture 3.2.3 bietet jetzt den Menüpunkt Datei/Export/FTP.
Beim Auswählen der "FTP" -Exportmethode und dem Auslösen des Plug-in-Codes stürzt Aperture mit einer EXC_BAD_ACCESS ab. Der illegale Speicherzugriff geschieht in der initWithAPIManager
Methode der Klasse SampleFTPExportPlugIn
wenn eine Referenz auf die ApertureExportManager
zu bekommen versuchen:
_exportManager = [[_apiManager apiForProtocol:@protocol(ApertureExportManager)] retain];
Dies ist die zweite Zeile, die nach Aperture übergibt die Steuerung an den Plug-in ausgeführt wird und scheint Die Standardmethode, einen Verweis auf die ApertureExportManager
in einem beliebigen Aperture Plug-in zu erhalten (ich habe keine alternativen Möglichkeiten gefunden, um das gleiche irgendwo zu erreichen).
Hier die Stacktrace:
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: 0x000000000000000d, 0x0000000000000000
VM Regions Near 0:
-->
__TEXT 0000000100000000-0000000100798000 [ 7776K] r-x/rwx SM=COW /Applications/Aperture.app/Contents/MacOS/Aperture
Application Specific Information:
objc_msgSend() selector name: class
objc[3000]: garbage collection is OFF
Performing @selector(a_exportPlugIn:) from sender NSMenuItem 0x111d2a540
Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0 libobjc.A.dylib 0x00007fff8711c090 objc_msgSend_vtable2 + 16
1 com.apple.CoreFoundation 0x00007fff8381e25f -[__NSCFString isEqualToString:] + 63
2 com.apple.PluginManager 0x0000000101211218 -[PROBundleHandler apiForProtocol:] + 109
3 com.apple.CoreFoundation 0x00007fff83852f4c __invoking___ + 140
4 com.apple.CoreFoundation 0x00007fff83852de4 -[NSInvocation invoke] + 132
5 com.apple.CoreFoundation 0x00007fff83852fb4 -[NSInvocation invokeWithTarget:] + 52
6 com.apple.CoreFoundation 0x00007fff8384dff4 ___forwarding___ + 756
7 com.apple.CoreFoundation 0x00007fff8384dc88 _CF_forwarding_prep_0 + 232
8 com.apple.SampleFTPExportPlugIn 0x000000012c0d5361 -[SampleFTPExportPlugIn initWithAPIManager:] + 209
9 com.apple.PluginManager 0x000000010120c6fa -[PROConcretePlugIn plugInInstance] + 212
Ich lese alles über Objective-C-Management-Speicher, kann aber nicht Sinn daraus machen. Alle anderen Beispiele, die ich im Internet gefunden habe, sind so implementiert, dass ich ein Kompatibilitätsproblem habe, etwas fehlt in meiner Aperture/Library-Installation. Wie kann ich das Problem eingrenzen?
EDIT:
Das Problem scheint mit dem übergebenen in apiManager zu sein. Die Methodensignatur ist:
- (id)initWithAPIManager:(id<PROAPIAccessing>)apiManager
Der Parameter dann zu unserem internen Referenz zugeordnet:
_apiManager = apiManager;
jedoch die in bestanden tatsächlichen Klasse ist PROPlugInFirewall
, da dieser Ausgang reviels:
NSLog(@"_apiManager class is: %@", [[_apiManager class] description]);
Dann führt der Aufruf der respondsToSelector
zum gleichen Absturz, obwohl diese Methode von NSObject geerbt wird.
if ([_apiManager respondsToSelector:@selector(apiForProtocol:)]) {
NSLog(@"responds");
}
Die _apiManager selbst beschreibt sich selbst als:
_apiManager is: <[*<PROBundleHandler: 0x14d79130> (PROAPIAccessing)*]>
Noch stecken ...
EDIT:
So ist es wie Aperture sieht in einem Zeiger vorbei, die Punkte zu Nirvana ... Allerdings habe ich gerade ein anderes Plugin installiert, von der Apple Webseite, mit dem Installer und allem. Dieser Fehler ist auch beim Aufruf aufgetreten ...
Ich habe dieses Problem auch, obwohl es für Aperture 3.2 nicht spezifisch erscheint. Ich habe ein Plugin ursprünglich für Aperture 3.1 mit Snow Leopard gebaut (XCode 4.3?); jetzt verursacht genau der gleiche Code den obigen Absturz bei jeder Version von Aperture, die ich versuche (3.1, 3.2 oder 3.3). Dies verwendet OSX 10.8 und XCode 4.5.1. Perfekte – Graham