2

少なくともOSXでは、AppleのObjective-Cランタイムによってクラスがロードされる方法のために、ロードされたクラスの実装を含むダイナミックライブラリを動的にアンロードすることはできないことを私は知っています。これは、ヘッダーを参照するオブジェクトについてのみ知っているが、クラスのメソッド実装を含まないライブラリにも当てはまりますか?

わかりやすくするために、Objective-Cを使用してダイナミックライブラリを記述したいと思いますが、のようなシグネチャを使用して関数をロードおよびアンロードしますResultObject* performActionOnObject(SomeObject* object)

編集:

より明確にするために、次のような関数を検討してください

NSNumber* computeFactorial(NSNumber* operand){
  NSUInteger n = [operand unsignedIntegerValue];
  /// ... pure C loop omitted
  return [NSNumber numberWithUnsignedInteger:n];
}

そして、それが呼び出されたときに自動解放プールがアクティブであると想定します。アンロードしても大丈夫ですか?

4

1 に答える 1

2

クライアントがクラスを直接参照する場合、クラスがリンクされたバイナリにない場合、リンカー エラーが発生します。実行時にクラスをロード/アンロードできますが、それらを使用するには名前 (文字列) で検索する必要があります。クラスを名前で検索する前に、クラスを登録する必要もあります。

C 関数をランタイム呼び出しに渡したりclass_addMethodmethod_exchangeImplementations実行時に ObjC クラスを拡張/変更したりできます。

「メソッドのスウィズリング」をグーグルで検索すると、例が表示されます。

つまり、最終的には… 「オブジェクトとどのようにやり取りするかによって異なります」。

于 2013-03-06T17:29:46.873 に答える