2

小さなプロジェクトに取り組んでいるときに、サブクラスdrawRect:の1つでカスタム描画を行う必要があることに気付きました。サブクラスのデフォルトの背景色が透明から黒に変更されたことに上書きしたときに気づきました(デフォルトの背景色とは、プロパティがnilのときにビューが描画する色を意味UIViewします)。この動作。drawRect:UIViewbackgroundColordrawRect:drawRect:[super drawRect:]

オーバーライドされているかどうかに関係なく、単にabackgroundColorをnil以外の値に設定すると機能するため、これは実際には問題ではありません。drawRect:しかし、それは私がサブクラスによってオーバーライドされてUIViewいるかどうかをどのように知っているかについて考え始めました。drawRect:Objective-Cが、クラスまたはそのスーパークラスでさえ特定のセレクターに応答するかどうかを判断する機能を提供していることを私は知っています。しかし、スーパークラスは、そのサブクラスがそのメソッドの1つをオーバーライドしたかどうかをどうやって知ることができるでしょうか?そして、このタイプの内省が実際に不可能である場合、私の例では何が起こっている可能性がありますか?

4

1 に答える 1

0

これはかなり奇妙です (ただし、意図したように聞こえます)。単に追加するだけです:

- (void) drawRect:...
{
    [super drawRect:...];
}

行動を誘発しますか?非定型。いずれにせよ、Objective-C ランタイム API を使用してクラス実装の詳細を徹底的に調べることは簡単です。Objective-C ランタイム リファレンスを参照してください。

UIView のドキュメントに-drawRect:は、サブクラス化に関するかなりの詳細が記載されています。これは、 を直接サブクラス化するときに super を呼び出す必要がないことを明確UIViewに示しており、最小限の余分な作業を実行するようにクラスが最適化されている可能性が高いことを示しています (実装で完全に消去される背景の描画など)。

于 2011-02-06T03:28:14.250 に答える