2011-02-06 10 views
2

小さなプロジェクトに取り組んでいるうちに、自分のUIViewサブクラスのいずれかでdrawRect:を介してカスタム描画を行う必要があることがわかりました。 drawRect:サブタイトルUIViewのサブクラスのデフォルトの背景色が透明から黒に変更されたことに気付きました(デフォルトの背景色は、backgroundColorプロパティがnilのときにビューが描画する色を表します)。drawRect:またはdrawRect:ただ単に[super drawRect:]を呼び出しただけです。サブクラスがメソッドをオーバーロードしているかどうかを知ることができますか?

backgroundColorを0以外の値に設定すると、drawRect:がオーバーライドされているかどうかにかかわらず、これは実際問題ではありません。しかし、UIViewdrawRect:がサブクラスによってオーバーライドされているかどうかを知る方法を考え始めました。私は、Objective-Cがクラスやそのスーパークラスでも特定のセレクタに応答するかどうかを判断する機能を提供することを知っています。しかし、どのようにしてスーパークラスは、そのサブクラスがそのメソッドの1つをオーバーライドしているかどうかを知ることができますか?このタイプのイントロスペクションが本当に不可能な場合、私の例では何が起こっているのでしょうか?

答えて

0

それはかなり奇妙です(しかし、それは意図されているように聞こえる)。単純に追加:

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

動作をトリガーしますか?非定型。いずれにしても、Objective-CランタイムAPIを使用してクラス実装の詳細を非常に徹底的にイントロスペクションすることは自明です。 Objective-C runtime reference.

UIView's documentation for -drawRect:は、サブクラス化についてかなり詳細になります。 UIViewを直接サブクラス化するときにスーパークラスを呼び出す必要はないと明言しています。これは、クラスが余分な作業を最小限に抑えるように最適化されている可能性が高いことを示しています。

+0

はい、驚くべきことに、動作はsuperへの単純な呼び出しでも持続します。私は、クラスのメソッドを取得するために使用される関数は、スーパークラスのメソッドも考慮に入れていると考えていたため、obj-cランタイムの可能性は無視されました(したがって、常にdrawRect:presentが存在します)。しかし、class_copyMethodList (...、...)関数(と多分?)は、スーパークラスのメソッドを除外しているように見えるので、UIViewがdrawRectを探すためにそのリストを反復できると仮定します。私はそれが本当に起こっているかどうかという疑問があると思います。入力いただきありがとうございます。 – Sam

関連する問題