objective functions declaracion objective-c syntax keyword use-case

objective c - functions - ¿Uso-caso del `vacío de la unidireccional` en Objective-C?



functions in objective c (3)

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

- (oneway void)release;

Busqué en la web y descubrí que se relaciona con el paso de mensajes asíncronos, que se ve similar con el envío de mensajes de Erlang.

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


De acuerdo con la documentación de Apple, oneway solo se usa para objetos distribuidos (y no para multihilo).

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

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


También parece ser necesario eliminar una advertencia con XCode 4.2 (LLVM). Específicamente:

-(void) release { }

da la siguiente advertencia en XCode 4.2 (con LLVM):

Advertencia: Problema semántico: Modificadores conflictivos de objeto distribuido en el tipo de retorno en la implementación de ''lanzamiento''

La advertencia se puede eliminar agregando el modificador de desplazamiento único:

-(oneway void) release { }

Esto es en la implementación de un singleton, por lo que el lanzamiento realmente no hace nada.

Esto es necesario (al menos para eliminar la advertencia) en iOS y en OS X. El protocolo NSObject en los documentos de iOS define la publicación como (unidireccional) aunque no haya Objetos Distribuidos en iOS. Parece que LLVM toma esto mientras que GCC no.


oneway se usa con la API de objetos distribuidos, que permite el uso de objetos object-c entre diferentes hilos 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 devolución del método sea nulo. Obviamente, nunca se usa con nada que no sea vacío, 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 objetos distribuidos, consulte los DistrObjects conceptuales de Cocoa .