próbuję uruchomić SampleFTPExportPlugIn, że pochodzi z Aperture SDK 2.1. Musiałem zmodyfikować ustawienie Base SDK i ręcznie skopiować folder PluginManager.Framework do katalogu/Library/Frameworks, zgodnie z opisem here.Aperture plug-in wywala z EXC_BAD_ACCESS
Wszystkie kompilacje i Aperture 3.2.3 oferuje teraz pozycję menu Plik/Eksport/FTP.
Po wybraniu metody eksportu "FTP" i tym samym wyzwoleniu kodu wtyczki, Aperture ulega awarii za pomocą EXC_BAD_ACCESS. Nielegalnego dostępu do pamięci dzieje w metodzie klasy SampleFTPExportPlugIn
initWithAPIManager
gdy próbuje uzyskać referencję do ApertureExportManager
:
_exportManager = [[_apiManager apiForProtocol:@protocol(ApertureExportManager)] retain];
To jest druga linia, która zostanie wykonana po Aperture rąk kontrolę nad do plug-in i wydaje się być standardowym sposobem uzyskania odniesienia do ApertureExportManager
w dowolnej wtyczce Aperture (nie znalazłem żadnych alternatywnych sposobów osiągnięcia tego samego w dowolnym miejscu).
tu 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
czytam wszystko o zarządzaniu pamięcią Objective-C, ale nie może mieć sens z niego. Wszystkie inne przykłady znalezione w sieci są zaimplementowane właśnie tak, więc myślę, że mam problem ze zgodnością, czegoś brakuje w mojej instalacji Aperture/Library. Jak mogę zawęzić problem?
EDIT:
Problem wydaje się być z przekazany w apiManager. Podpis metoda jest:
- (id)initWithAPIManager:(id<PROAPIAccessing>)apiManager
Parametr jest następnie przypisany do naszego wewnętrznego odniesienia:
_apiManager = apiManager;
Jednak rzeczywista klasa przekazany jest PROPlugInFirewall
, jak to wyjście reviels:
NSLog(@"_apiManager class is: %@", [[_apiManager class] description]);
Następnie wywołanie respondsToSelector
prowadzi do tej samej awarii, chociaż ta metoda jest dziedziczona z NSObject.
if ([_apiManager respondsToSelector:@selector(apiForProtocol:)]) {
NSLog(@"responds");
}
Sam _apiManager opisuje się jako:
_apiManager is: <[*<PROBundleHandler: 0x14d79130> (PROAPIAccessing)*]>
nadal tkwi ...
EDIT:
Tak wygląda Aperture przechodzi w wskaźnik, który punkty do nirvany ... Zainstalowałem jednak inną wtyczkę ze strony Apple, z instalatorem i ze wszystkim. Ten też się nie powiodło po wywołaniu ...
Mam również ten problem, chociaż nie wydaje się być specyficzny dla programu Aperture 3.2. Mam wtyczkę oryginalnie zbudowaną dla Aperture 3.1 z wykorzystaniem Snow Leopard (XCode 4.3?); teraz dokładnie ten sam kod powoduje powyższą awarię w dowolnej wersji Aperture I (3.1, 3.2 lub 3.3). Używa się OSX 10.8 i XCode 4.5.1. – Graham