Cas d'utilisation de «oneeway void» en Objective-C?

107

J'ai trouvé un mot-clé étrange dans NSObject.h

- (oneway void)release;

J'ai cherché sur le Web et j'ai appris qu'il était lié au passage de messages asynchrones, ce qui ressemble à celui d'Erlang.

Il semble que cela puisse faire beaucoup de choses intéressantes. Quels sont quelques bons cas d'utilisation de ce mot clé?

éonil
la source
5
Facile à retenir: oneway voidc'est l'une de ces belles métaphores accidentelles que l'on voit parfois dans le codage, en l'occurrence la mort. "S'il y a quelque chose de l'autre côté, ne nous le dis pas."
buildsuceeded le

Réponses:

111

onewayest utilisé avec l'API des objets distribués, qui permet l'utilisation d'objets objective-c entre différents threads ou applications. Il indique au système qu'il ne doit pas bloquer le thread appelant tant que la méthode n'est pas retournée. Sans cela, l'appelant bloquera, même si le type de retour de la méthode est void. De toute évidence, il n'est jamais utilisé avec autre chose que void, car cela signifierait que la méthode renvoie quelque chose, mais l'appelant ne l'obtient pas.

Pour plus d'informations sur les objets distribués, consultez Cocoa Conceptual DistrObjects .

ughoavgfhw
la source
6
Le lien ne semble plus fonctionner. Je n'ai pas pu le trouver dans la documentation d'Apple mais j'ai trouvé: chachatelier.fr/programmation/fichiers/cpp-objc-en.pdf qui fournit une bonne explication du mot-clé «oneway». Voir section 4.4.5 (pdf page 24)
jlmendezbonini
@Robin Merci pour la mise à jour. Il était parti ces derniers mois, mais je ne pouvais pas trouver une autre référence d'Apple alors je l'ai juste laissée.
ughoavgfhw
et je pensais que le seul moyen de déclencher des tâches réseau était de les sous-threader ... en utilisant gcd_async et ses amis ..
Nirav Bhatt
18

Selon la documentation d'Apple, oneway n'est utilisé que pour les objets distribués (et non pour le multithreading).

Le modificateur oneeway n'est utilisé que si l'objet est distant. Dans ce cas, l'appel de libération peut être renvoyé de manière asynchrone (avant que la méthode ne se termine). Dans un réseau, cela a du sens car l'attente d'un message de retour peut prendre un certain temps.

La méthode release n'a pas de valeur de retour et donc l'appel peut être exécutée de manière asynchrone. En revanche, conserver et relâcher automatiquement renvoyer un identifiant et nous devons donc attendre que le message de retour soit transféré sur tout le réseau.

Homme libre
la source
J'ai une question connexe: si l'utilisation du onewaymot - clé empêche le message de bloquer le thread appelant pendant que la méthode appelée est exécutée, cela rend la méthode appelée exécutée sur un deuxième thread. N'est-ce pas le multitâche (dans sa forme la plus simple)? Puis-je l'utiliser pour détacher rapidement certaines petites opérations (sans trop d'effort) à un autre thread? Merci beaucoup.
Constantino Tsarouhas le
1
Non, tu ne peux pas. Dans l'informatique distribuée, le thread est exécuté dans une machine / processus différent. Vous pouvez utiliser performSelector: onThread: withObject: waitUntilDone: pour vos besoins.
Freeman
2
Alors, que se passe-t-il - (oneway void) releasealors? Ce n'est pas sur une autre machine ou processus.
Constantino Tsarouhas
+1 pour expliquer en quoi consiste exactement une manière -> définir one wayune méthode signifie don't wait for the method to complete and return anything. block it if there is any n/w trafic or so. Dois-je avoir un sens?
thesummersign