Question

Je voudrais coder un proxy qui transmet les invocations de méthode à un autre objet sur TCP sans NSConnection et d'autres choses NSDistanceObject. Ce que je veux mon propre protocole.

Le problème est que le sous-classement forwardInvocation: NSProxy et dominante ne suffit pas. Je dois aussi passer outre methodSignatureForSelector

Voici ma question:

– (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
{
    return ??? 
}
Était-ce utile?

La solution 3

J'ai trouvé un solution intelligente pour générer objets NSInvocation.

Autres conseils

@ Brian, cela peut être ok, mais setProtocolForProxy: est juste pour l'optimisation. cocoafan pourrait mandater pour sa solution, mais il ne serait pas un remplacement de drop-in. Vous êtes censé être en mesure d'obtenir automatiquement des signatures. Pour ce faire, le protocole réseau a besoin d'un moyen de demander la signature.

Je crois que la solution est ici pour inclure dans le protocole réseau une méthode « demande de signature de la méthode », et le faire tourner methodSignatureForSelector: sur l'objet distant et encode et renvoie le résultat. Voilà ce que fait NSDistantObject.

Fournir setProtocolForProxy: est une optimisation importante si vous allez bavarder beaucoup, mais il ne vous gêne aux objets que vous avez un protocole, et avant 10.5 qui présente certaines limitations gênantes (toutes les méthodes sont nécessaires). Même sur 10.5, il peut introduire des limitations problématiques si elle est la seule façon d'obtenir les signatures de méthode.

@cocoafan, je pense que vous avez probablement raison pour créer cette à partir de zéro au-dessus de NSProxy, mais ne jetez un oeil à NSConnection et voyez si vous pouvez sous-classe pour gérer la connexion réseau comme vous le souhaitez. Si vous pouvez trouver un moyen de le faire (bien que je ne vois pas un moyen facile tout de suite), vous aurez probablement beaucoup de choses gratuitement à partir NSDistantObject.

Le NSDistantObject de façon gère cela est par sa méthode de setProtocolForProxy:, qui spécifie un protocole contenant la liste des méthodes que l'objet à l'autre extrémité des poignées connexion. Il peut alors utiliser les informations pour ces méthodes pour fournir des objets NSMethodSignature appropriés lorsque vous effectuez le transfert.

Il semble que le plus simple de le faire est via la fonction protocol_getMethodDescription(), a déclaré dans <objc/runtime.h>. Cela renvoie une struct objc_method_description qui contient un champ types. Je crois que vous devriez être en mesure de transmettre cette valeur dans +[NSMethodSignature signatureWithObjCTypes:] pour obtenir un objet de signature de la méthode qui correspond à ce qui est déclaré dans le protocole.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top