0

I'm using respondsToSelector: and most of the time it works fine. But there is one case in which I get wrong result:

UIButton* button = [[UIButton alloc] init];
if([button respondsToSelector:NSSelectorFromString(@"setTitle:")]) // returns YES
{
    // try to call "setTitle:"
}

respondsToSelector: returns YES but there is no setTitle: selector in UIButton class. There is setTitle:forState: selector but this is definitely not the same.

So why does respondsToSelector: return YES?

4

2 に答える 2

1

セレクターへの応答は、パブリック インターフェイスをチェックするだけでなく、見つかった任意のメソッドを使用します。UIButton初期の API forがタイトルを直接公開したかどうかは覚えていませんが、状態が変化すると内部的に呼び出される可能性があります。

実際に存在することを確認する必要がある APIにのみ使用するようにしてくださいrespondsToSelector:。プライベート API が後で公開されることが多く、これが興味深い状況を引き起こす可能性があることに注意してください...

于 2015-04-27T13:04:43.680 に答える
0

Alexandr、この「respondsToSelector」メソッドは、呼び出そうとしているメソッドをオブジェクトが実装しているかどうかを確認したい場合にのみ使用してください。ボタンのタイトルを設定するために、なぜこれを使用する必要があるのですか??

通常、カスタム デリゲート メソッドを使用する場合は、このメソッドを使用する必要があります。

于 2015-04-27T13:05:18.253 に答える