CALayerのサブクラスVSカテゴリ

私が CALayer をサブクラス化して drawInContext:メソッドをオーバーライドすると、すべてが素晴らしいです。サブクラス化の代わりに同じメソッドをオーバーライドする CALayer のカテゴリを作成すると、呼び出されますが、何も描画されません。もちろん、 [super drawInContext:ctx] はどちらの場合でも呼び出されます。どうして?
サブクラス化に問題はありませんが、なぜこれが起こるのか不思議です。サブクラス全体を作成する代わりに、カテゴリを使用してどのクラスのメソッドも追加または上書きできるという印象を受けました。
ありがとうございました!

1
基本的には、カテゴリ内のスーパー実装を呼び出すことは、あなたがしようとしている元のオブジェクトの実装ではなく、カテゴリを持つオブジェクトのスーパークラスで呼び出すことです。
追加された 著者 jrturton,
私が知っているカテゴリからではありません。私はそうする魔法のような恐ろしい方法があると確信していますが、それは私を超えています。
追加された 著者 jrturton,
OK、私は通常これは偽薬ではありませんが、私がリンクしている偽薬は少しの接線で外れますので、そこに行きます。
追加された 著者 jrturton,
@ジョシュキャスウェル - 参照してください、今あなたは私を怖がってしまった!
追加された 著者 jrturton,
@jrturton:確かに、魔法のような恐ろしい方法は、スウィズリングと呼ばれています。
追加された 著者 Josh Caswell,
ああ、私は、元のメソッドと呼ばれるカテゴリの中でオーバーライドされたメソッドで[super]を呼び出すとどこかを読んだと思ったが、それは奇妙に聞こえた。私は間違っていた :)
追加された 著者 juandemarco,
それで、元のメソッドを呼び出すだけの方法がありますか?
追加された 著者 juandemarco,
ありがとう!あなたは答えとしてあなたのコメントをマークする必要があります!
追加された 著者 juandemarco,

1 答え

カテゴリの super 実装を呼び出すと、あなたがしようとしている元のオブジェクトの実装ではなく、カテゴリを持つオブジェクトのスーパークラスで呼び出されます。

super, when used in the context of a method call in an instance method, calls the superclass's implementation of that method.

あるカテゴリでは、サブクラスを作成していません。 - あなたが書いたコードは、カテゴリを持つクラスによって直接実行されています。したがって、 NSObject である実装の super への呼び出しは、 CALayer のスーパークラスに送られます。

したがって、私はこのカテゴリでこれを試みるときにコンパイラの警告を受け取らなかったことに少し驚いています。

There is further excellent discussion of this here: Is calling super in a category the same as calling it in a subclass?

2
追加された
また、カテゴリを使用してフレームワーククラスのメソッドをオーバーライドすることは、ほぼ確実に悪い考えであることにも注意してください。クラスのすべてのインスタンスは、あなたが作成したかどうかにかかわらず、オーバーライドされたメソッドを使用します。
追加された 著者 Josh Caswell,