Pergunta

Gostaria de código de um proxy que método encaminha chamadas para outro objeto sobre TCP sem NSConnection e coisas NSDistanceObject. O que eu quero é o meu próprio protocolo.

O problema é que subclassificação NSProxy e substituindo forwardInvocation: não é suficiente. Eu também tenho que methodSignatureForSelector override

Aqui está a minha pergunta:

– (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
{
    return ??? 
}
Foi útil?

Solução 3

Eu encontrei um inteligente solução para gerar NSInvocation objetos.

Outras dicas

@ Brian, Isso pode ser ok, mas setProtocolForProxy: é apenas para otimização. cocoafan poderia obrigar-lo para a sua solução, mas não seria um substituto. Você deveria ser capaz de obter assinaturas automaticamente. Para isso, o protocolo de rede precisa de uma forma de solicitar a assinatura.

Eu acredito que a solução aqui é a de incluir no protocolo de rede um método "método de solicitação de assinatura", e executá-lo methodSignatureForSelector: no objeto distante e codificar e retornar o resultado. Isso é o que NSDistantObject faz.

O fornecimento setProtocolForProxy: é uma otimização importante se você estiver indo a bater muito, mas não restringi-lo a objetos que você tem um protocolo para, e antes de 10.5, que introduz algumas limitações irritantes (todos os métodos são necessários). Mesmo em 10,5, pode apresentar algumas limitações problemáticas se é a única maneira de obter assinaturas de método.

@cocoafan, eu acho que provavelmente você está certo para criar esta a partir do zero em cima do NSProxy, mas pegue uma olhada NSConnection e veja se você pode subclasse-lo para gerenciar a conexão de rede da maneira que quiser. Se você puder encontrar uma maneira de fazer isso (embora eu não vejo uma maneira fácil com o pé direito), você provavelmente vai ter um monte de coisas de graça a partir NSDistantObject.

As alças NSDistantObject forma como isto é pelo seu método setProtocolForProxy:, que especifica um protocolo que contém a lista de métodos que o objecto na outra extremidade das alças de ligação. Ele pode então usar as informações para esses métodos para fornecer objetos NSMethodSignature apropriadas ao fazer encaminhamento.

Parece que o mais simples de fazer isso é através da função protocol_getMethodDescription(), declarou em <objc/runtime.h>. Este retorna um struct objc_method_description que contém um campo types. Eu acredito que você deve ser capaz de passar esse valor para +[NSMethodSignature signatureWithObjCTypes:] para obter um objeto assinatura do método que corresponde ao que é declarado no protocolo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top