0

ドキュメントによると、 デフォルトの実装は何もしません。

しかし...drawRectメソッドから例外をスローすると、次のコールスタックが表示されます

3   EasyWakeup                          0x0003a7b6 -[AlarmIntervalView drawRect:] + 71
4   UIKit                               0x003f6187 -[UIView(CALayerDelegate) drawLayer:inContext:] + 426
5   QuartzCore                          0x011a8b5e -[CALayer drawInContext:] + 143

理解できるように、これは-[CALayer drawInContext:]呼び出しデリゲートメソッドのデフォルトの実装を意味します。それが正しいか?私はスウィズリングテクニックを知っているので、Objective-Cで何もわかりません...

4

1 に答える 1

4

あなたは、CALayerのデフォルトdrawInContext:が何もしないという点で正しいです。これは、レイヤーにデリゲートがあり、そのレイヤーのデリゲートがを実装していない限り当てはまりますdrawLayer:inContext:。したがって、ドキュメントの問題は、「デフォルトの実装は何もしない」というステートメントの横に小さなアスタリスクを付ける必要があるということです。

すべてのビューは、ある種のCALayerでバックアップされていることを忘れないでください。このレイヤーは、ビューがデリゲートとして設定されるように自動的にセットアップされます。表面的には明らかではないのは、UIViewがCALayerのデリゲートを実装していることdrawLayer:inContext:です。これは、コールスタック上のすべての呼び出しで見られるものです。

AlarmIntervalViewのインスタンスには自動的にバッキングレイヤーがあり、そのバッキングレイヤーのデリゲートはAlarmIntervalViewインスタンスに設定されています。システムの一部はdrawInContext:、デリゲート(持っている)をチェックし、引数としてデリゲートrespondsToSelector:を送信しdrawLayer:inContext:(UIViewが応答します)、最後に実際にメッセージを送信するバッキングレイヤーを呼び出しますdrawLayer:inContext:。UIViewの実装はdrawLayer:inContext:、ビューのを呼び出しますdrawRect:

なぜスウィズリングについて言及するのかよくわかりません。

[私の応答は長く、主に私の利益のためです。それは私も学ぶのに役立ちます。]

于 2012-01-14T01:13:43.903 に答える