-forwardInvocation для методов класса

Я изо всех сил пытаюсь перенаправить метод класса через класс фасада.

Чтобы уточнить, я переопределяю все следующие методы:

-(NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
-(void)forwardInvocation:(NSInvocation *)anInvocation
+(BOOL)instancesRespondToSelector:(SEL)aSelector
+(NSMethodSignature *)instanceMethodSignatureForSelector:(SEL)aSelector
+(IMP)instanceMethodForSelector:(SEL)aSelector
+(BOOL)resolveClassMethod:(SEL)sel
+(BOOL)resolveInstanceMethod:(SEL)sel

.. и тем не менее, для метода класса вызывается только +resolveClassMethod. Оттуда я немедленно получаю непризнанное исключение селектора независимо от того, возвращаю ли я YES или NO.

Что происходит?
Работает ли пересылка сообщений класса иначе, чем пересылка сообщений экземпляра?
Точно так же, почему нет метода класса +forwardInvocation?

Любая помощь будет принята с благодарностью.


person user1439216    schedule 18.07.2012    source источник


Ответы (1)


Итак, вы уже знаете, что для того, чтобы объект выполнял forwardInvocation методы экземпляра, вы должны реализовать методы экземпляра -forwardInvocation: и -methodSignatureForSelector: (остальные не нужны). Что ж, методы класса — это просто методы объекта класса. Классы являются объектами и работают так же, как любые другие объекты, и поддерживают все методы экземпляра корневого класса (в данном случае NSObject).

Среде выполнения Objective-C все равно, является ли объект объектом класса или объектом, не относящимся к классу. Механизм пересылки сообщений тот же. Поэтому, когда вы отправляете сообщение объекту, каким бы он ни был, и он не может его найти, он просто ищет методы forwardInvocation: и methodSignatureForSelector: для объекта. Поэтому вам нужно иметь эти методы в вашем объекте класса.

то есть реализовать методы класса +forwardInvocation: и +methodSignatureForSelector:

person newacct    schedule 14.12.2012
comment
Я не вижу метод +forwardInvocation: в протоколе NSObject - person Julian; 27.06.2014
comment
@JulianKról: -forwardInvocation: относится к классу NSObject. - person newacct; 27.06.2014
comment
хорошо, но вы упомянули в ответе +forwardInvocation, поэтому я прокомментировал - person Julian; 27.06.2014
comment
@JulianKról: все методы экземпляра корневого класса (NSObject является корневым классом) автоматически наследуются как методы класса корневого класса (и, следовательно, как методы класса всех других классов, наследуемых от него). Это связано с тем, что надклассом метакласса корневого класса является сам корневой класс. - person newacct; 27.06.2014