2012-04-11 8 views
1

私は目的CがCの厳密なスーパーセットであることを知っており、同じことを書いています。 しかし、私はObjective-Cはコンパイル前にCコードに変換されていますか?

@interface Myintf {} 
@end 

を書くことは、それがC構造体に変換しますか、またはそれはObjective Cのコンパイラによって作成されたデータ構造Myintfためのメモリレイアウトはruntime.hで定義されたCの構造体と同じであるということです?

約同じ質問objc_msgsend

アップルのドキュメントはObjective-Cで

を言うと、メッセージは実行時までメソッド実装にバインドされていません。 コンパイラはメッセージ式をメッセージング関数objc_msgSendの呼び出しに変換します。この関数は、受信者と、メッセージに記載されているメソッドの名前(メソッドセレクタ)を2つの主要なパラメータとして取ります。

答えて

3

は、それがために使用される昔はCの構造体

に変換しますんが、現代のランタイム(OS X 10.5+ 64ビットとiOS)で、私はそれをもう少しだと思います複雑です。 Fragile Instance Variable問題が解決されたため、従来のstructを使用することはできません。

と同じ質問についてobjc_msgsend

はい。すべてのメソッド呼び出し(より正確にはすべてのメッセージ送信)はobj_msgsend()への呼び出しに変換されます(異なるC関数が使用されている場合はsuperが受信者として使用される場合を除く)。

Objective-Cの初期の実装はプリプロセッサとして実装され、中間ステップとしてCソースコードを生成したことに注意してください。現代のコンパイラはこれを気にせず、Objective-Cソースコードからオブジェクトコード形式にまっすぐに進みます。

2

いいえ、どちらの場合も最終的にランタイムに依存します。ある意味では、Cインターフェイスを使用するように変換されますが、抽象レベルが導入されています。完全に静的ではありません。

コンパイラによって生成されたアセンブリを見て、これがより詳細にどのように動作するかを調べるのに役立ちます。

宣言を考える:

id objc_msgSend(id theReceiver, SEL theSelector, ...); 

をコンパイラがあなたの実装がメソッドを呼び出すobjc_msgSendへの呼び出しを挿入します。これは静的なC関数呼び出しには還元されませんが、動的ディスパッチは間接的な別のレベルです。

関連する問題