我尝试运行 Aperture SDK 2.1 随附的 SampleFTPExportPlugIn 。我必须调整基本SDK设置,然后手动将PluginManager.Framework文件夹复制到/Library/Frameworks,如here所述。

现在,所有编译和 Aperture 3.2.3 提供了菜单项File/Export/FTP。

当选择“FTP”导出方法,从而触发所述插件代码,光圈崩溃与EXC_BAD_ACCESS。尝试获取对initWithAPIManager的引用时,非法内存访问发生在SampleFTPExportPlugIn类的ApertureExportManager方法中:

   _exportManager = [[_apiManager apiForProtocol:@protocol(ApertureExportManager)] retain];

这是Aperture将控制权移交给该插件后执行的第二行,并且似乎是在任何Aperture插件中获取ApertureExportManager引用的标准方式(我尚未找到实现该目标的任何其他方法在任何地方都一样)。

这是堆栈跟踪:
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

我读了所有有关Objective-C内存管理的内容,但没有意义。我在网上找到的所有其他示例都是以这种方式实现的,所以我想我有一个兼容性问题,我的Aperture/Library安装中缺少了一些问题。如何缩小问题范围?

编辑:

问题似乎出在apiManager中。方法签名为:
     - (id)initWithAPIManager:(id<PROAPIAccessing>)apiManager

然后将该参数分配给我们的内部引用:
  _apiManager = apiManager;

但是,实际传入的类是PROPlugInFirewall,因为此输出令人回味:
   NSLog(@"_apiManager class is: %@", [[_apiManager class] description]);

然后,尽管此方法是从NSObject继承的,但是调用respondsToSelector也会导致相同的崩溃。
   if ( [_apiManager respondsToSelector:@selector(apiForProtocol:)] ) {
        NSLog(@"responds");
    }

_apiManager本身将其描述为:
   _apiManager is: <[*<PROBundleHandler: 0x14d79130> (PROAPIAccessing)*]>

仍然卡住...

编辑:

因此,看起来Aperture传递了一个指向必杀技的指针...但是,我刚刚从Apple网页安装了另一个插件,其中包含安装程序和所有内容。那个在调用时也失败了...

最佳答案

  • 下载FXPlug 1.2.5 SDK
  • 打开安装程序包
  • 的内容
  • 将PluginManager.framework复制到/Library/Frameworks

  • 您的插件应该可以正常工作了!

    FXPlug SDK(2.2/2.4)中较新版本的PluginManager.framework会导致此崩溃。

    在Xcode 4.5的10.8上测试

    关于objective-c - Aperture插件因EXC_BAD_ACCESS而崩溃,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10386395/

    10-10 16:08