Usando NSProxy e forwardInvocation:
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 ???
}
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.