Anwendungsfall von "oneway void" in Objective-C?


107

Ich habe in NSObject.h ein seltsames Schlüsselwort gefunden

- (oneway void)release;

Ich habe das Web durchsucht und festgestellt, dass es sich um eine asynchrone Nachrichtenübermittlung handelt, die mit Erlangs Nachrichtenübermittlung ähnlich aussieht.

Es scheint, dass dies viele interessante Dinge machen kann. Was sind einige gute Anwendungsfälle für dieses Schlüsselwort?


5
Leicht zu merken: oneway voidist eine dieser schönen zufälligen Metaphern, die wir manchmal in der Codierung sehen, in diesem Fall für den Tod. "Wenn es irgendetwas auf der anderen Seite gibt, sag es uns nicht."
Builds erfolgreich

Antworten:


110

onewaywird mit der API für verteilte Objekte verwendet, die die Verwendung von Objective-C-Objekten zwischen verschiedenen Threads oder Anwendungen ermöglicht. Es teilt dem System mit, dass es den aufrufenden Thread nicht blockieren soll, bis die Methode zurückkehrt. Ohne diese Option wird der Aufrufer blockiert, obwohl der Rückgabetyp der Methode ungültig ist. Offensichtlich wird es nie mit etwas anderem als void verwendet, da dies bedeuten würde, dass die Methode etwas zurückgibt, aber der Aufrufer es nicht versteht.

Weitere Informationen zu verteilten Objekten finden Sie unter Cocoa Conceptual DistrObjects .


6
Der Link scheint nicht mehr zu funktionieren. Ich konnte es nicht in Apples Dokumenten finden, aber ich fand: chachatelier.fr/programmation/fichiers/cpp-objc-en.pdf , das eine gute Erklärung für das Schlüsselwort "oneway" enthält. Siehe Abschnitt 4.4.5 (pdf Seite 24)
jlmendezbonini

@Robin Danke für das Update. Es war in den letzten Monaten weg, aber ich konnte keine andere Referenz von Apple finden, also habe ich es einfach verlassen.
ughoavgfhw

und ich dachte, die einzige Möglichkeit, Netzwerkaufgaben auszulösen, besteht darin, sie mit gcd_async und seinen Freunden zu unterfädeln.
Nirav Bhatt

18

Laut Apples Dokumentation wird oneway nur für verteilte Objekte verwendet (und nicht für Multithreading).

Der Oneway-Modifikator wird nur verwendet, wenn das Objekt entfernt ist. In diesem Fall kann der Release-Aufruf asynchron zurückgegeben werden (bevor die Methode beendet wurde). In einem Netzwerk ist dies sinnvoll, da das Warten auf eine Rückmeldung eine Weile dauern kann.

Die Freigabemethode hat keinen Rückgabewert und kann daher asynchron ausgeführt werden. Im Gegensatz dazu geben Beibehalten und Autorelease eine ID zurück. Daher müssen wir warten, bis die Rückmeldung im gesamten Netzwerk übertragen wird.


Ich habe eine verwandte Frage: Wenn die Verwendung des onewaySchlüsselworts dazu führt, dass die Nachricht den aufrufenden Thread nicht blockiert, während die aufgerufene Methode ausgeführt wird, wird die aufgerufene Methode in einem zweiten Thread ausgeführt. Ist das nicht Multitasking (in seiner einfachsten Form)? Kann ich damit einige kleine Vorgänge schnell (ohne großen Aufwand) von einem anderen Thread trennen? Vielen Dank.
Constantino Tsarouhas

1
Nein, das kannst du nicht. Beim Distribute Computing wird der Thread auf einer anderen Maschine / einem anderen Prozess ausgeführt. Sie können performSelector: onThread: withObject: waitUntilDone: für Ihren Zweck verwenden.
Freeman

2
Also, was passiert - (oneway void) releasedann? Es ist nicht auf einer anderen Maschine oder einem anderen Prozess.
Constantino Tsarouhas

+1 für die Erklärung, worum es bei genau einem Weg genau geht -> das Definieren one wayeiner Methode bedeutet don't wait for the method to complete and return anything. block it if there is any n/w trafic or so. Sinn mache ich?
Thesummersign
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.