我尝试运行 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 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/