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