我尝试运行 Aperture SDK 2.1 附带的 SampleFTPExportPlugIn 。我必须调整Base SDK设置并手动将PluginManager.Framework文件夹复制到/ Library / Frameworks,如here所述。
所有编译和 Aperture 3.2.3 现在提供菜单项File / Export / FTP。
选择“FTP”导出方法并因此触发插件代码时,Aperture会发生EXC_BAD_ACCESS崩溃。在尝试获取initWithAPIManager
的引用时,非法内存访问在类SampleFTPExportPlugIn
的{{1}}方法中发生:
ApertureExportManager
这是在Aperture将控制权交给插件后执行的第二行,似乎是在任何Aperture插件中获取 _exportManager = [[_apiManager apiForProtocol:@protocol(ApertureExportManager)] retain];
引用的标准方法(我没有找到了在任何地方实现相同目标的替代方法。
这里的堆栈跟踪:
ApertureExportManager
我阅读了有关Objective-C内存管理的所有内容,但无法理解它。我在网上找到的所有其他示例都是这样实现的,所以我想我有一个兼容性问题,我的Aperture / Library安装中缺少一些东西。我该如何缩小问题?
修改
问题似乎与传入的apiManager有关。方法签名是:
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
然后将参数分配给我们的内部参考:
- (id)initWithAPIManager:(id<PROAPIAccessing>)apiManager
然而传入的实际类是 _apiManager = apiManager;
,因为此输出会重新启动:
PROPlugInFirewall
然后调用 NSLog(@"_apiManager class is: %@", [[_apiManager class] description]);
会导致同样的崩溃,尽管此方法是从NSObject继承的。
respondsToSelector
_apiManager本身将自己描述为:
if ( [_apiManager respondsToSelector:@selector(apiForProtocol:)] ) {
NSLog(@"responds");
}
仍然坚持......
修改
所以看起来Aperture正在传递一个指向天堂的指针...但是,我刚从Apple网页安装了另一个插件,安装程序和所有内容。那个人在被调用时也失败了......
答案 0 :(得分:2)
你的插件现在应该可以使用了!
FXPlug SDK(2.2 / 2.4)中较新版本的PluginManager.framework将导致此次崩溃。
使用Xcode 4.5测试10.8
答案 1 :(得分:1)
我发现Justin上面的答案在需要为Aperture 3.4构建时对我不起作用,因为它需要FXPlug 1.x版本不支持的x86_64架构。
在尝试各种版本的PluginManager框架后,我发现版本available here不会导致上述崩溃,并且还包含有效的64位体系结构。只需将/Library/Frameworks/PluginManager.framework/Versions/B的内容替换为链接存档的内容,就可以了。