CFBundle
またはNSBundle
ではなく、dlopen
を使用しています。それにも関わらず、Code Loading Programming Topicsマニュアルは、これは言う:CFBundle
はネイティブのObjective-Cランタイムをサポートしていないので、Cocoaアプリケーションで
、あなたは、実行可能コードをロードし、アンロードするCFBundle
ルーチンを使用しないでください。 NSBundle
はObjective-Cシンボルをランタイムシステムに正しくロードしますが、実行時の制限のために一度ロードされたCocoaバンドルをアンロードする方法はありません。
この理由:Objective-Cランタイムシステムにおける制限の
は、
NSBundle
が実行可能なコードをアンロードすることができません。
これは私はあなたがあなたのライブラリーをロードするとき、それはObjective-Cランタイムに自身を登録し、ランタイムは再びライブラリにdlopen
を呼び出します(または何らかの方法でライブラリの参照カウントを増加)ことを疑うことができます。
私はObjective-Cランタイムのソースコードを検索し、thisが見つかりました:
// dylibs are not allowed to unload
// ...except those with image_info and nothing else (5359412)
if (result->mhdr->filetype == MH_DYLIB && _hasObjcContents(result)) {
dlopen(result->os.dl_info.dli_fname, RTLD_NOLOAD);
}
そうです、Objective-Cランタイムは、具体的にアンロードされるのを防ぐために、あなたのライブラリーにdlopen
を呼びかけています。あなたが不正行為をしてdlclose
を2回呼び出すと、悪いことが起こると予想するべきです。
あなたのライブラリが隠された形で 'dlopen'されていないことを確かめていますか?あるいはバグかもしれない。メモリリーク - は 'dlopen'-edハンドルの近くでメモリを上書きしていますか? –
dlopenは、ライブラリハンドルの参照カウントを保持します。 dlopenを2回実行すると、ライブラリをアンロードするために2つのdlclose()が必要になります。 obj-Cコードをインクルードする場合、ダイナミックライブラリが必要なのでしょうか?あなたのプログラムを実行すると、最初のdlopenが実行される可能性があります。 – Finslicer
はい、私はそのdlopenedが2回はないと確信しています。あなたはdlopenで簡単なプログラムを試してみることができ、dlcloseには目的のCコードを持つ動的ライブラリを使うことができます。 – MacGeek