106 votes

Cas d’utilisation de « void oneway » en Objective-C ?

J’ai trouvé un mot étrange dans NSObject.h

J’ai cherché sur le web et appris que ce qui a trait au passage, de messages asynchrone qui ressemble avec passage de messages de Erlang.

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

109voto

ughoavgfhw Points 28400

oneway est utilisé avec les objets distribués API, qui permet l'utilisation de l'objective-c des objets entre différents threads ou des applications. Il indique au système qu'il ne devrait pas bloquer le thread appelant jusqu'à ce que le retour de la méthode. Sans elle, l'appelant bloc, même si la méthode est le type de retour est void. Évidemment, il n'est jamais utilisé à autre chose qu'à vide, car cela signifierait que la méthode renvoie quelque chose, mais l'appelant n'a pas l'obtenir.

Pour en savoir plus sur les objets distribués, voir Cacao Conceptuel DistrObjects.

38voto

jeffc666 Points 517

Il semble également être nécessaire pour éliminer un avertissement avec XCode 4.2 (LLVM). Plus précisément:

-(void) release { }

donne l'avertissement suivant dans XCode 4.2 (avec LLVM):

avertissement: Sémantique Problème: les conflits d'objet distribué des modificateurs sur le type de retour dans la mise en œuvre de "libération"

L'avertissement peut être éliminé par l'ajout de la oneway modificateur:

-(oneway void) release { }

C'est dans la mise en œuvre d'un singleton si la libération n'a pas vraiment faire quoi que ce soit.

Cela est nécessaire (au moins pour éliminer l'avertissement) sur iOS ainsi que sur OS X. Le NSObject protocole dans l'iOS docs définit libération (oneway void) même si il n'y a pas d'Objets Distribués dans iOS. Il semble que LLVM capte alors que GCC ne le fait pas.

18voto

Freeman Points 1725

Selon la documentation d'Apple oneway est utilisé uniquement pour les objets distribués (et pas pour le multithreading).

Le oneway modificateur n'est utilisé que si l'objet est à distance. Dans ce cas, la libération d'appel peut renvoyer de manière asynchrone (avant la méthode est à la fin). Dans un réseau, il a un sens, car en attente d'un message de retour peut prendre un certain temps.

La méthode release n'a pas de valeur de retour et donc appeler elle peut être exécutée de manière asynchrone. En revanche, les conserver et les autorelease retourner un code et donc nous devons attendre le retour de message pour être transféré dans tout le réseau.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X