Если это весь код, который вы создали, то лучший способ сделать это, вероятно, заставить сам класс Layer
принять протокол, а не переменную.
@interface Layer : NSObject <CocosNodeOpacity> { ... }
Ключевым преимуществом этого подхода является то, что компилятор проверит, реализовали ли вы все необходимые методы в протоколе во время компиляции, что, как правило, то, что вам нужно. Добавление методов в том же месте, что и в остальной части реализации стандартного класса, проще для понимания (нет необходимости искать источник магического кода) и менее хрупко, чем использование категорий (добавление одного и того же метода через разные категории может привести к неопределенному поведению) , Как правило, я использую категории только тогда, когда у меня есть , например, добавление методов к стороннему коду (с закрытым исходным кодом).
Если вы не контролируете источник Layer
, вам, возможно, придется использовать это вместо того, чтобы объявить свой ивар:
Layer<CocosNodeOpacity> *content;
Обратите внимание, что принятие протокола позволяет вам статически печатать переменные с типом класса и получать предупреждения компиляции, если методы отсутствуют. Тем не менее, вы не получаете методы «бесплатно», так как вам все равно придется их реализовывать. Тем не менее, разумное использование протоколов и статическая типизация могут сделать ваш код более надежным и «отказоустойчивым», чем использование id
в качестве типа для всего. Вы должны быть благодарны за то, что вы не просто взяли легкий путь. : -)
Подробнее о протоколах (включая обязательные и необязательные методы) см. этот ответ SO .