NSProxy с forwardInvocation с самооценкой?
Я настроил NSProxy, forwardInvocation и т. Д. Для захвата сообщений, передаваемых объекту - все работает нормально.
Я также хочу перехватывать сообщения, передаваемые self, например: [self doSomething] или self.myVal = 5;
Кажется, это не работает... это возможно?
1 ответ
Отправка сообщения экземпляру прокси через self
или другая переменная, указывающая на прокси, ничем не отличается. Под капотом каждая отправка сообщения преобразуется в вызов функции objc_msgSend(), передавая адрес экземпляра в качестве получателя, поэтому действительно не имеет значения, используете ли вы self или "внешнюю переменную", пока каждый из них указывает к тому же объекту.
Просто чтобы убедиться, я проверил это путем реализации подкласса NSProxy (TestProxy), пересылающего сообщения подклассу NSObject (TestObject). TestObject имеет один пользовательский метод, который выводит описание объекта:
@interface TestObject : NSObject
- (void)printDescription;
@end
Прокси имеет следующие переопределенные методы (_theObject - это прокси-экземпляр TestObject):
- (void)forwardInvocation:(NSInvocation *)anInvocation
{
SEL selector = [anInvocation selector];
if ([_testObject respondsToSelector:selector])
[anInvocation invokeWithTarget:_testObject];
}
- (BOOL)respondsToSelector:(SEL)aSelector
{
return [_testObject respondsToSelector:aSelector];
}
- (NSMethodSignature*)methodSignatureForSelector:(SEL)selector
{
return [_testObject methodSignatureForSelector:selector];
}
Отправка сообщения printDescription на прокси через self
правильно перенаправляет вызов сообщения _theObject:
[((id)self) printDescription];
Если ваша проблема заключалась в том, что компилятор выдает ошибки при попытке отправить сообщение напрямую self
не бросая его id
тогда я думаю, что нет никакого лекарства от этого. Поскольку компилятор не может обнаружить методы в интерфейсе класса self
(прокси) и не достаточно умен, чтобы понять, что это на самом деле прокси для другого класса, он даст вам ошибки.