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 (прокси) и не достаточно умен, чтобы понять, что это на самом деле прокси для другого класса, он даст вам ошибки.

Другие вопросы по тегам