Caso de uso de `oneway void` em Objective-C?

107

Encontrei uma palavra-chave estranha em NSObject.h

- (oneway void)release;

Eu pesquisei na web e descobri que ela está relacionada à passagem de mensagem assíncrona, que é semelhante à passagem de mensagem de Erlang.

Parece que isso pode tornar muitas coisas interessantes. Quais são alguns bons casos de uso dessa palavra-chave?

eonil
fonte
5
Fácil de lembrar: oneway voidé uma daquelas belas metáforas acidentais que às vezes vemos na codificação, neste caso, a morte. "Se houver alguma coisa do outro lado, não nos diga."
buildsucceeded

Respostas:

110

onewayé usado com a API de objetos distribuídos, que permite o uso de objetos objetivo-c entre diferentes threads ou aplicativos. Ele diz ao sistema que não deve bloquear o thread de chamada até que o método retorne. Sem ele, o chamador irá bloquear, mesmo que o tipo de retorno do método seja nulo. Obviamente, ele nunca é usado com nada além de void, pois isso significaria que o método retornaria algo, mas o chamador não entende.

Para obter mais informações sobre objetos distribuídos, consulte Cocoa Conceptual DistrObjects .

ughoavgfhw
fonte
6
O link parece não funcionar mais. Não consegui encontrar nos documentos da Apple, mas encontrei: chachatelier.fr/programmation/fichiers/cpp-objc-en.pdf que fornece uma boa explicação da palavra-chave "oneway". Consulte a seção 4.4.5 (pdf página 24)
jlmendezbonini
@Robin Obrigado pela atualização. Ele sumiu nos últimos meses, mas não consegui encontrar outra referência da Apple, então simplesmente o deixei.
ughoavgfhw
e eu pensei que a única maneira de disparar tarefas de rede é subencadeando-as ... usando gcd_async e seus amigos ..
Nirav Bhatt
18

De acordo com a documentação da Apple, oneway é usado apenas para objetos distribuídos (e não para multithreading).

O modificador oneway só é usado se o objeto for remoto. Nesse caso, a chamada de liberação pode retornar de forma assíncrona (antes que o método seja encerrado). Em uma rede, faz sentido porque a espera por uma mensagem de retorno pode demorar um pouco.

O método de liberação não tem valor de retorno e, portanto, a chamada pode ser executada de forma assíncrona. Em contraste, reter e autorelease retornam um id e, portanto, temos que esperar a mensagem de retorno ser transferida por toda a rede.

Freeman
fonte
Tenho uma pergunta relacionada: se o uso da onewaypalavra - chave faz com que a mensagem não bloqueie o thread de chamada enquanto o método chamado é executado, isso faz com que o método chamado seja executado em um segundo thread. Isso não é multitarefa (em sua forma mais simples)? Posso usar isso para desanexar algumas pequenas operações rapidamente (sem muito esforço) para outro segmento? Muito obrigado.
Constantino Tsarouhas
1
Não, você não pode. Na computação distribuída, o thread é executado em uma máquina / processo diferente. Você pode usar performSelector: onThread: withObject: waitUntilDone: para sua finalidade.
Freeman
2
Então, o que acontece com - (oneway void) releaseentão? Não está em outra máquina ou processo.
Constantino Tsarouhas
1 para explicar o que exatamente uma maneira é precisamente -> definir one wayum método significa que don't wait for the method to complete and return anything. block it if there is any n/w trafic or so. eu faço sentido?
thesummersign de