Caso d'uso di "oneway void" in Objective-C?


107

Ho trovato una strana parola chiave in NSObject.h

- (oneway void)release;

Ho cercato sul Web e ho scoperto che si riferisce al passaggio di messaggi asincrono, che è simile al passaggio di messaggi di Erlang.

Sembra che questo possa fare molte cose interessanti. Quali sono alcuni buoni casi d'uso di questa parola chiave?


5
Facile da ricordare: oneway voidè una di quelle belle metafore accidentali che a volte vediamo nella codifica, in questo caso per la morte. "Se c'è qualcosa dall'altra parte, non dircelo."
riuscita il

Risposte:


111

onewayviene utilizzato con l'API degli oggetti distribuiti, che consente l'uso di oggetti oggettivo-c tra thread o applicazioni diversi. Indica al sistema che non dovrebbe bloccare il thread chiamante fino a quando il metodo non ritorna. Senza di essa, il chiamante si bloccherà, anche se il tipo restituito dal metodo è nullo. Ovviamente, non viene mai utilizzato con qualcosa di diverso da void, poiché ciò significherebbe che il metodo restituisce qualcosa, ma il chiamante non lo ottiene.

Per ulteriori informazioni sugli oggetti distribuiti, vedere Cocoa Conceptual DistrObjects .


6
Il collegamento sembra non funzionare più. Non sono riuscito a trovarlo nei documenti di Apple ma ho trovato: chachatelier.fr/programmation/fichiers/cpp-objc-en.pdf che fornisce una buona spiegazione della parola chiave "oneway". Vedi sezione 4.4.5 (pdf pagina 24)
jlmendezbonini

@Robin Grazie per l'aggiornamento. Era sparito negli ultimi mesi, ma non sono riuscito a trovare un altro riferimento da Apple, quindi l'ho lasciato.
ughoavgfhw

e ho pensato che l'unico modo per attivare le attività di rete fosse sottoporle a thread secondari ... utilizzando gcd_async e i suoi amici ..
Nirav Bhatt

18

Secondo la documentazione di Apple, oneway viene utilizzato solo per oggetti distribuiti (e non per multithreading).

Il modificatore oneway viene utilizzato solo se l'oggetto è remoto. In questo caso la chiamata di rilascio può tornare in modo asincrono (prima che il metodo sia terminato). In una rete ha senso perché l'attesa di un messaggio di ritorno può richiedere del tempo.

Il metodo di rilascio non ha alcun valore di ritorno e quindi la chiamata può essere eseguita in modo asincrono. Al contrario, conservare e rilasciare automaticamente restituisce un ID e quindi dobbiamo attendere che il messaggio di ritorno venga trasferito attraverso la rete.


Ho una domanda correlata: se l'utilizzo della onewayparola chiave fa sì che il messaggio non blocchi il thread chiamante mentre viene eseguito il metodo chiamato, ciò fa sì che il metodo chiamato venga eseguito su un secondo thread. Non è multitasking (nella sua forma più semplice)? Posso usarlo per staccare rapidamente alcune piccole operazioni (senza troppi sforzi) da un altro thread? Grazie mille.
Constantino Tsarouhas

1
No, non puoi. Nell'elaborazione distribuita il thread viene eseguito in una macchina / processo diverso. Puoi usare performSelector: onThread: withObject: waitUntilDone: per il tuo scopo.
Freeman

2
Allora cosa succede con - (oneway void) releaseallora? Non è su un'altra macchina o processo.
Constantino Tsarouhas

+1 per spiegare esattamente cos'è esattamente un modo -> definire one wayun metodo significa don't wait for the method to complete and return anything. block it if there is any n/w trafic or so. Ho senso?
thesummersign
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.