0

Xcodeで、私が書くと-

id a;

a、[a ... にメッセージを書き始めると、Xcode はオートコンプリート候補の長いリストを表示します。これらの提案は何に基づいて行われていますか (明らかにすべての可能なメソッド名)?

次のように、任意のメソッド呼び出しをコンパイルできます

[a viewDidLoad];

私は id がどんなメッセージでも受け取ることができることを知っています。しかし

[a asdfgh]; //asdfgh random string

コンパイルしません。

4

2 に答える 2

2

これらの提案は何に基づいて行われていますか (明らかにすべての可能なメソッド名)?

これらの提案はいくぶん知的なものです。私が知る限り、それらはオブジェクトのクラスと採用されたプロトコルに含まれます。はジェネリックであるためid、既存のメッセージを送信する可能性があるため (応答する場合と応答しない場合があります)、Xcode は任意のクラスまたはプロトコルで見つかったものを提案します。

しかし[a asdfgh]; コンパイルされません

コンパイラはある程度の保護を提供するためです。セレクターがどこにも宣言されていない場合、そのセレクターは存在しないと見なされるため、オブジェクトに送信することは不可能であるため、エラーが発生します。

于 2013-03-02T06:10:02.740 に答える
1

ここに何があるかがわかりますid

typedef struct objc_object {
    Class isa;
} *id;

これはまったくではなく、クラス定義を指す、単一のメンバーを含むvoid *へのポインターです。structしたがって、実行時に任意のデータ型の形式をとることができます。動的型付け

コンパイル時に、正しいメソッド名が存在するかどうかをチェックしますか?

[a asdfgh];name のメソッド/セレクターがないため、エラーが発生しますasdfgh

[a viewDidLoad];コンパイルは問題なく実行できますが、実行時にクラッシュする可能性があります。

于 2013-03-02T06:07:35.640 に答える