これは前の質問からのわずかな続きです:
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
が、そのメソッドを呼び出すように要求すると、「既知のメソッドはありません」と表示されます。メカニズムについて少し興味がありますか?