Przypadek użycia „jednokierunkowa próżnia” w Objective-C?


107

Znalazłem dziwne słowo kluczowe w NSObject.h

- (oneway void)release;

Przeszukałem sieć i dowiedziałem się, że wiąże się to z asynchronicznym przekazywaniem wiadomości, które wygląda podobnie z przekazywaniem wiadomości Erlanga.

Wydaje się, że może to zrobić wiele interesujących rzeczy. Jakie są dobre przypadki użycia tego słowa kluczowego?


5
Łatwe do zapamiętania: oneway voidto jedna z tych pięknych, przypadkowych metafor, które czasami widzimy podczas kodowania, w tym przypadku śmierci. „Jeśli coś jest po drugiej stronie, nie mów nam”.
kompilacja zakończyła się

Odpowiedzi:


111

onewayjest używany z interfejsem API obiektów rozproszonych, który umożliwia użycie obiektów Objective-C między różnymi wątkami lub aplikacjami. Mówi systemowi, że nie powinien blokować wątku wywołującego, dopóki metoda nie zwróci. Bez niej obiekt wywołujący będzie blokował, mimo że zwracany typ metody jest void. Oczywiście nigdy nie jest używany z niczym innym niż void, ponieważ oznaczałoby to, że metoda zwraca coś, ale wywołujący tego nie otrzymuje.

Aby uzyskać więcej informacji na temat obiektów rozproszonych, zobacz Cocoa Conceptual DistrObjects .


6
Wydaje się, że link już nie działa. Nie mogłem go znaleźć w dokumentach Apple, ale znalazłem: chachatelier.fr/programmation/fichiers/cpp-objc-en.pdf, który zapewnia dobre wyjaśnienie słowa kluczowego „jednokierunkowy”. Zobacz rozdział 4.4.5 (pdf strona 24)
jlmendezbonini

@Robin Dzięki za aktualizację. Nie było go przez ostatnie kilka miesięcy, ale nie mogłem znaleźć innego odniesienia od Apple, więc po prostu go zostawiłem.
ughoavgfhw

i pomyślałem, że jedynym sposobem na odpalenie zadań sieciowych jest ich pod-wątek ... używając gcd_async i jego przyjaciół ..
Nirav Bhatt

18

Zgodnie z dokumentacją Apple'a metoda jednokierunkowa jest używana tylko dla obiektów rozproszonych (a nie dla wielowątkowości).

Modyfikator jednokierunkowy jest używany tylko wtedy, gdy obiekt jest zdalny. W takim przypadku wywołanie release może powrócić asynchronicznie (przed zakończeniem metody). W sieci ma to sens, ponieważ oczekiwanie na wiadomość zwrotną może chwilę potrwać.

Metoda release nie ma wartości zwracanej, więc wywołanie jej może być wykonywane asynchronicznie. Natomiast retain i autorelease zwracają identyfikator, więc musimy czekać na przesłanie komunikatu zwrotnego w całej sieci.


Mam powiązane pytanie: Jeśli użycie onewaysłowa kluczowego powoduje, że komunikat nie blokuje wątku wywołującego podczas wykonywania wywoływanej metody, powoduje to, że wywoływana metoda jest wykonywana w drugim wątku. Czy to nie jest wielozadaniowość (w najprostszej formie)? Czy mogę tego użyć, aby szybko odłączyć niektóre małe operacje (bez większego wysiłku) do innego wątku? Dziękuję Ci bardzo.
Constantino Tsarouhas

1
Nie, nie możesz. W obliczeniach dystrybucyjnych wątek jest wykonywany na innej maszynie / procesie. Możesz użyć performSelector: onThread: withObject: waitUntilDone: do swoich celów.
Freeman,

2
Więc co się - (oneway void) releasewtedy stanie? Nie ma go na innym komputerze lub procesie.
Constantino Tsarouhas

+1 za wyjaśnienie, na czym dokładnie polega jeden sposób -> określenie one waymetody oznacza don't wait for the method to complete and return anything. block it if there is any n/w trafic or so. Czy mam sens?
thesummersign
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.