0

これは前の質問からのわずかな続きです:

for(id <stuffieProtocol> eachObject in stuffieArray) {
    if([eachObject respondsToSelector:@selector(secretID)]) [eachObject secretID];
}

上記は、からいくつかのオブジェクトを取り出し、NSArrayそれらがメソッドに応答するかどうかを確認する高速列挙ループからの行secretIDです。メソッドsecretIDは一部では@protocolなく、コレクション内のオブジェクトの1つで定義されたメソッドです。

コンパイラがどちらが問題ないか、idは気にせず、メソッドが定義されていないため、上記のifステートメントは失敗します。定義するタイプに各オブジェクトをキャストすることでこれを修正できます。"No known instance method for selector secretID"<stuffieProtocol>secretID:

if([eachObject respondsToSelector:@selector(secretID)]) [(Ted *)eachObject secretID];

eachObject私の質問は元のコードにあります。コンパイラはメソッドに応答することをどのように認識しますsecretIDが、そのメソッドを呼び出すように要求すると、「既知のメソッドはありません」と表示されます。メカニズムについて少し興味がありますか?

4

1 に答える 1

2

コンパイラは、オブジェクトがそのセレクタに応答するかどうかについては何も知りませんが、ランタイムは応答します。(つまり、コンパイラはコードを実行しません。)コンパイラは、NSObjectがに応答できることだけを気にしrespondsToSelector:ます。

于 2012-08-02T13:27:02.970 に答える