1

Objective C は C の厳密なスーパーセットであり、同じことを書いていることは知っています。しかし、私が書くとき

@interface Myintf {}
@end

C struct に変換されますか、それとも Objective c コンパイラによって作成されたデータ構造体 Myintf のメモリ レイアウトは、runtime.h で定義された C struct のメモリ レイアウトと同じですか?

objc_msgsend に関する同じ質問

アップルの文書によると

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

4

2 に答える 2

3

C構造体に変換されますか

昔はそうでしたが、最近のランタイム (OS X 10.5+ 64 ビットおよび iOS) では、もう少し複雑だと思います。壊れやすいインスタンス変数の問題が解決されstructているため、従来の変数を使用することはできません。

objc_msgsend に関する同じ質問

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

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

于 2012-04-11T07:53:16.983 に答える
2

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

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

宣言を考えると:

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

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

于 2012-04-11T07:07:41.827 に答える