Aperture SDK 2.1に付属のSampleFTPExportPlugInを実行しようとしました。こちら で説明されているように、Base SDK 設定を微調整し、PluginManager.Framework フォルダーを /Library/Frameworks に手動でコピーする必要がありました。
すべてのコンパイルとAperture 3.2.3では、メニュー項目 File/Export/FTP が提供されるようになりました。
「FTP」エクスポート方法を選択してプラグインコードをトリガーすると、Aperture が EXC_BAD_ACCESS でクラッシュします。への参照を取得しようとするとinitWithAPIManager
、クラスのメソッドで不正なメモリアクセスが発生します。SampleFTPExportPlugIn
ApertureExportManager
_exportManager = [[_apiManager apiForProtocol:@protocol(ApertureExportManager)] retain];
これは、Aperture が制御をプラグインに渡した後に実行される 2 行目でApertureExportManager
、どの Aperture プラグインでも への参照を取得する標準的な方法のようです (同じことを実現する別の方法は見つかりませんでした)。どこでも)。
ここでスタックトレース:
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 のメモリ管理についてすべて読みましたが、意味がわかりません。Web で見つけた他のすべての例はそのように実装されているため、互換性の問題があり、Aperture / ライブラリのインストールに何かが欠けていると思います。問題を絞り込むにはどうすればよいですか?
編集:
問題は、渡された apiManager にあるようです。メソッドのシグネチャは次のとおりです。
- (id)initWithAPIManager:(id<PROAPIAccessing>)apiManager
パラメータは内部参照に割り当てられます。
_apiManager = apiManager;
ただし、渡される実際のクラスは ですPROPlugInFirewall
。この出力は次のようになります。
NSLog(@"_apiManager class is: %@", [[_apiManager class] description]);
次に を呼び出すと、respondsToSelector
このメソッドは NSObject から継承されていますが、同じクラッシュが発生します。
if ( [_apiManager respondsToSelector:@selector(apiForProtocol:)] ) {
NSLog(@"responds");
}
_apiManager 自体は、次のように説明しています。
_apiManager is: <[*<PROBundleHandler: 0x14d79130> (PROAPIAccessing)*]>
まだくっついている...
編集:
したがって、Aperture は nirvana を指すポインターを渡しているように見えます...ただし、別のプラグインを Apple Web ページから、インストーラーとすべてを使用してインストールしました。それも呼び出されたときに失敗しました...