trato de ejecutar el SampleFTPExportPlugIn que viene con el SDK 2.1 Apertura . Tuve que modificar la configuración del Base SDK y copiar manualmente la carpeta PluginManager.Framework a/Library/Frameworks, como se describe en here.Aperture Plug-en choques con EXC_BAD_ACCESS
Todas las compilaciones y Aperture 3.2.3 ahora ofrecen la opción de menú Archivo/Exportar/FTP.
Al seleccionar el método de exportación "FTP" y desencadenar el código del complemento, Aperture se bloquea con un EXC_BAD_ACCESS. El acceso a la memoria ilegal ocurre en el método de la clase SampleFTPExportPlugIn
initWithAPIManager
cuando se trata de obtener una referencia a la ApertureExportManager
:
_exportManager = [[_apiManager apiForProtocol:@protocol(ApertureExportManager)] retain];
Esta es la segunda línea que se ejecuta después de las manos de apertura el control al plug-in y parece ser la forma estándar de obtener una referencia al ApertureExportManager
en cualquier complemento de Aperture (no he encontrado ninguna forma alternativa de lograr el mismo en ninguna parte).
Aquí el 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
He leído todo acerca de la gestión de memoria de Objective-C, pero no puede hacer sentido de ella. Todos los otros ejemplos que encontré en la web se implementan así, así que supongo que tengo un problema de compatibilidad, algo que falta en mi instalación de Aperture/Library. ¿Cómo puedo reducir el problema?
EDIT:
El problema parece estar relacionado con la aprobada en apiManager. La firma del método es:
- (id)initWithAPIManager:(id<PROAPIAccessing>)apiManager
se asigna el parámetro luego a nuestra referencia interna:
_apiManager = apiManager;
Sin embargo la clase real ha pasado es PROPlugInFirewall
, ya que este reviels de salida:
NSLog(@"_apiManager class is: %@", [[_apiManager class] description]);
Luego, al llamar al respondsToSelector
se produce el mismo bloqueo, aunque este método se hereda de NSObject.
if ([_apiManager respondsToSelector:@selector(apiForProtocol:)]) {
NSLog(@"responds");
}
El _apiManager misma se describe como:
_apiManager is: <[*<PROBundleHandler: 0x14d79130> (PROAPIAccessing)*]>
todavía está atascado ...
EDIT:
Así que parece que la abertura está pasando en un puntero que los puntos al nirvana ... Sin embargo, acabo de instalar otro complemento, desde la página web de Apple, con el instalador y todo. Eso también falló cuando se invocó ...
También estoy teniendo este problema, aunque no parece específico para Aperture 3.2. Tengo un plugin originalmente creado para Aperture 3.1 usando Snow Leopard (XCode 4.3?); ahora el mismo código causa el bloqueo anterior en cualquier versión de Aperture que pruebo (3.1, 3.2 o 3.3). Esto es usando OSX 10.8 y XCode 4.5.1. – Graham