Используя NSProxy и forwardInvocation:

Я хотел бы кодировать прокси что вперед вызовы метода к другому объекту по TCP без NSConnection и NSDistanceObject материал. То, что я хочу, является моим собственным протоколом.

Проблема состоит в том что, разделяя на подклассы NSProxy и переопределение forwardInvocation: не достаточно. Я должен также переопределить methodSignatureForSelector

Вот мой вопрос:

– (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
{
    return ??? 
}
5
задан cocoafan 1 June 2009 в 21:50
поделиться

3 ответа

Я нашел умное решение для создания объектов NSInvocation .

0
ответ дан 15 December 2019 в 06:34
поделиться

Способ NSDistantObject обрабатывает это с помощью его метода setProtocolForProxy: , который определяет протокол, содержащий список методов, которые объект на другом конце ручек подключения. Затем он может использовать информацию для этих методов для предоставления соответствующих объектов NSMethodSignature при пересылке.

Похоже, что наиболее просто сделать это с помощью функции protocol_getMethodDescription () , объявлен в . Это возвращает структуру objc_method_description , которая содержит поле types . Я считаю, что вы должны иметь возможность передать это значение в + [NSMethodSignature signatureWithObjCTypes:] , чтобы получить объект подписи метода, соответствующий тому, что '

1
ответ дан 15 December 2019 в 06:34
поделиться

@Brian, это может быть нормально, но setProtocolForProxy: предназначен только для оптимизации. cocoafan может потребовать его для своего решения, но это не будет заменой. Вы должны иметь возможность автоматически получать подписи. Для этого сетевому протоколу нужен способ запроса подписи.

Я считаю, что решение здесь состоит в том, чтобы включить в сетевой протокол метод «подпись метода запроса» и запустить его methodSignatureForSelector: на удаленном объекте и закодировать и вернуть результат. Это то, что делает NSDistantObject .

Предоставление setProtocolForProxy: - важная оптимизация, если вы собираетесь много болтать, но он ограничивает вас объектами, для которых у вас есть протокол, и до версии 10.5, которая вводит некоторые досадные ограничения (требуются все методы). Даже в версии 10.5 он может ввести некоторые проблемные ограничения, если это единственный способ получить сигнатуры методов.

@cocoafan, я думаю, вы, вероятно, правы, создавая это с нуля поверх NSProxy , но взгляните на NSConnection и посмотрите, можете ли вы подклассифицировать его для управления сетевым подключением так, как вы хотите. Если вы найдете способ сделать это (хотя я не вижу легкого пути сразу), вы, вероятно, получите много вещей бесплатно от NSDistantObject .

единственный способ получить сигнатуры методов.

@cocoafan, я думаю, вы, вероятно, правы, создавая это с нуля поверх NSProxy , но посмотрите на NSConnection ] и посмотрите, сможете ли вы подклассифицировать его для управления сетевым подключением так, как вы хотите. Если вы найдете способ сделать это (хотя я не вижу легкого пути сразу), вы, вероятно, получите много вещей бесплатно от NSDistantObject .

единственный способ получить сигнатуры методов.

@cocoafan, я думаю, вы, вероятно, правы, создавая это с нуля поверх NSProxy , но посмотрите на NSConnection ] и посмотрите, сможете ли вы подклассифицировать его для управления сетевым подключением так, как вы хотите. Если вы найдете способ сделать это (хотя я не вижу легкого пути сразу), вы, вероятно, получите много вещей бесплатно от NSDistantObject .

2
ответ дан 15 December 2019 в 06:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: