古いバージョンのフレームワークでは、A と B の 2 つのクラスがあり、A は B のサブクラスでした。新しいバージョンでは、B は存在せず、B のすべて (ivars など) は現在 A にあります。実行可能ファイルは古いバージョンに対してリンクされているため、_OBJC_IVAR_$_B.ivar を探します。ただし、新しいバージョンで動作する必要があります (再コンパイルできません)。_OBJC_IVAR_$_A.ivar への参照を変更する方法はありますか?
1 に答える
1
これを安全に行う方法はありません。シンボルを解決する必要があるだけでなく、ランタイムがそのシンボルにつまずく可能性があります。シンボルのエイリアシングはうまくいくかもしれませんが、壊れやすいでしょう。
古いバージョンのフレームワークに依存して ivar シンボルを直接参照する実行可能ファイルは、互換性のあるクラス レイアウトを必要とし、それらの ivar を持つサブクラスを持つことを含みます。
Objective-C "2.0" が壊れやすい基本クラスの問題を解決したとき、ivar をクラスからクラスへ移動する機能は追加されませんでした (A と B の両方が同じ名前の ivar を持つことができるため、疑わしいものの、完全に有効です)。
絶対にこのパスをたどる必要がある場合は、リンク行でシンボルのエイリアスを試すことができます。ビルド設定エディターで、適切なエイリアス フラグを OTHER_LD_FLAGS に追加します。
-alias symbol_name alternate_symbol_name
Create an alias named alternate_symbol_name for the symbol symbol_name. By default the
alias symbol has global visibility. This option was previous the -idef:indir option.
于 2013-06-21T16:42:50.660 に答える