¿Caso de uso de "oneway void" en Objective-C?


107

Encontré una palabra clave extraña en NSObject.h

- (oneway void)release;

Busqué en la web y descubrí que se relaciona con el paso de mensajes asincrónico, que se ve similar al paso de mensajes de Erlang.

Parece que esto puede hacer muchas cosas interesantes. ¿Cuáles son algunos buenos casos de uso de esta palabra clave?


5
Fácil de recordar: oneway voides una de esas hermosas metáforas accidentales que a veces vemos en la codificación, en este caso de la muerte. "Si hay algo al otro lado, no nos lo digas".
buildsucceeded

Respuestas:


111

onewayse utiliza con la API de objetos distribuidos, que permite el uso de objetos objetivo-c entre diferentes subprocesos o aplicaciones. Le dice al sistema que no debe bloquear el hilo de llamada hasta que el método regrese. Sin él, la persona que llama se bloqueará, aunque el tipo de retorno del método sea nulo. Obviamente, nunca se usa con otra cosa que no sea void, ya que hacerlo significaría que el método devuelve algo, pero la persona que llama no lo obtiene.

Para obtener más información sobre los objetos distribuidos, consulte Cocoa Conceptual DistrObjects .


6
El enlace ya no parece funcionar. No pude encontrarlo en los documentos de Apple, pero encontré: chachatelier.fr/programmation/fichiers/cpp-objc-en.pdf que proporciona una buena explicación de la palabra clave "oneway". Ver sección 4.4.5 (pdf página 24)
jlmendezbonini

@Robin Gracias por la actualización. Se había ido durante los últimos meses, pero no pude encontrar otra referencia de Apple, así que lo dejé.
ughoavgfhw

y pensé que la única forma de disparar tareas de red es subprocesarlas ... usando gcd_async y sus amigos ..
Nirav Bhatt

18

Según la documentación de Apple, oneway solo se usa para objetos distribuidos (y no para subprocesos múltiples).

El modificador unidireccional solo se usa si el objeto es remoto. En este caso, la llamada de liberación puede regresar de forma asincrónica (antes de que el método haya terminado). En una red tiene sentido porque esperar un mensaje de respuesta puede llevar un tiempo.

El método de liberación no tiene valor de retorno y, por lo tanto, la llamada se puede ejecutar de forma asincrónica. Por el contrario, conservar y liberar automáticamente devuelve una identificación y, por lo tanto, tenemos que esperar a que el mensaje de devolución se transfiera a través de la red.


Tengo una pregunta relacionada: si el uso de la onewaypalabra clave hace que el mensaje no bloquee el hilo de llamada mientras se ejecuta el método llamado, eso hace que el método llamado se ejecute en un segundo hilo. ¿No es eso una multitarea (en su forma más simple)? ¿Puedo usar esto para separar algunas operaciones pequeñas rápidamente (sin mucho esfuerzo) a otro hilo? Muchas gracias.
Constantino Tsarouhas

1
No, no puedes. En la computación distribuida, el hilo se ejecuta en una máquina / proceso diferente. Puede usar performSelector: onThread: withObject: waitUntilDone: para su propósito.
Freeman

2
Entonces, ¿qué pasa con - (oneway void) releaseentonces? No está en otra máquina o proceso.
Constantino Tsarouhas

+1 para explicar de qué se trata exactamente una forma -> definir one waya un método significa don't wait for the method to complete and return anything. block it if there is any n/w trafic or so. ¿Tengo sentido?
thesummersign
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.