6

Aperture SDK 2.1に付属のSampleFTPExportPlugInを実行しようとしました。こちら で説明されているように、Base SDK 設定を微調整し、PluginManager.Framework フォルダーを /Library/Frameworks に手動でコピーする必要がありました。

すべてのコンパイルとAperture 3.2.3では、メニュー項目 File/Export/FTP が提供されるようになりました。

「FTP」エクスポート方法を選択してプラグインコードをトリガーすると、Aperture が EXC_BAD_ACCESS でクラッシュします。への参照を取得しようとするとinitWithAPIManager、クラスのメソッドで不正なメモリアクセスが発生します。SampleFTPExportPlugInApertureExportManager

   _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 ページから、インストーラーとすべてを使用してインストールしました。それも呼び出されたときに失敗しました...

4

2 に答える 2

2
  • FXPlug 1.2.5 SDK をダウンロード
  • インストーラー パッケージの内容を開く
  • PluginManager.framework を /Library/Frameworks にコピーします

あなたのプラグインは今すぐ動作するはずです!

FXPlug SDK (2.2/2.4) の PluginManager.framework の新しいバージョンでは、このクラッシュが発生します。

Xcode 4.5 を使用して 10.8 でテスト済み

于 2013-01-17T05:59:21.933 に答える
1

FXPlug 1.xバージョンがサポートしていないx86_64アーキテクチャが必要なため、Aperture 3.4用にビルドする必要がある場合、上記のJustinの回答はうまくいかないことがわかりました。

PluginManager フレームワークのさまざまなバージョンを試した結果、ここで入手できるバージョンでは上記のクラッシュが発生せず、有効な 64 ビット アーキテクチャも含まれていることがわかりました。/Library/Frameworks/PluginManager.framework/Versions/B の内容をリンクされたアーカイブの内容に置き換えるだけで、準備完了です。

于 2013-03-07T01:02:13.750 に答える