64 ビット ランタイムでは、オブジェクトの isa フィールドに直接アクセスする機能がなくなりました。これは、CLANG のエンジニアが以前から警告していたことです。それらは、新しく改名された isa ヘッダーのどのセクションにオブジェクトに関する情報が含まれているか、または他の状態 (NSNumber/NSString の場合) が含まれているかについて、常に変化する ABI ルールのかなり独創的な (そして魔法の) セットに置き換えられました。新しい「魔法の」 isa をオプトアウトし、特定の実行時コード パスを通る遅い道を犠牲にして、独自の 1 つ (生の isa )を使用できるという点で、抜け穴があるようです。
私の質問は 2 つあります。
オプトアウトしobject_setClass()
て任意のクラスを のオブジェクトに+allocWithZone:
入れることができる場合、クラスの余分なスペースに何かを配置することも可能ですか?それとも、ランタイムは高速パスを介してそれを読み取ろうとしますか?
ランタイムが通常の isa と区別できるように、isa ヘッダーの正確には何がタグ付けされていますか?