Kasus penggunaan `oneway void` di Objective-C?


107

Saya menemukan kata kunci yang aneh di NSObject.h

- (oneway void)release;

Saya mencari di web, dan mempelajarinya terkait dengan penyampaian pesan yang tidak sinkron, yang terlihat mirip dengan penyampaian pesan Erlang.

Sepertinya ini bisa membuat banyak hal menarik. Apa kasus penggunaan yang baik dari kata kunci ini?


5
Mudah diingat: oneway voidadalah salah satu metafora indah yang terkadang kita lihat dalam pengkodean, dalam hal ini kematian. "Jika ada sesuatu di sisi lain, jangan beri tahu kami."
build berhasil

Jawaban:


111

onewaydigunakan dengan API objek terdistribusi, yang memungkinkan penggunaan objek obyektif antara utas atau aplikasi yang berbeda. Ini memberi tahu sistem bahwa ia tidak boleh memblokir utas panggilan sampai metode kembali. Tanpanya, pemanggil akan memblokir, meskipun jenis kembalian metode tidak berlaku. Jelas, itu tidak pernah digunakan dengan apa pun selain void, karena melakukan itu berarti metode tersebut mengembalikan sesuatu, tetapi pemanggil tidak mendapatkannya.

Untuk informasi lebih lanjut tentang objek terdistribusi, lihat Cocoa Conceptual DistrObjects .


6
Tautan sepertinya tidak berfungsi lagi. Saya tidak dapat menemukannya di dalam dokumen Apple tetapi saya menemukan: chachatelier.fr/programmation/fichiers/cpp-objc-en.pdf yang memberikan penjelasan yang baik tentang kata kunci "satu arah". Lihat bagian 4.4.5 (pdf halaman 24)
jlmendezbonini

@Robin Terima kasih atas pembaruannya. Itu hilang selama beberapa bulan terakhir, tetapi saya tidak dapat menemukan referensi lain dari Apple jadi saya meninggalkannya.
ughoavgfhw

dan saya pikir satu-satunya cara untuk mengaktifkan tugas jaringan adalah dengan menyub-utasnya ... menggunakan gcd_async dan teman-temannya ..
Nirav Bhatt

18

Menurut dokumentasi Apple, satu arah hanya digunakan untuk objek terdistribusi (dan bukan untuk multithreading).

Pengubah satu arah hanya digunakan jika objeknya jauh. Dalam hal ini panggilan rilis dapat kembali secara asinkron (sebelum metode dihentikan). Dalam jaringan, ini masuk akal karena menunggu pesan balasan bisa memakan waktu cukup lama.

Metode rilis tidak memiliki nilai kembali sehingga panggilan itu dapat dijalankan secara asinkron. Sebaliknya, pertahankan dan pelepasan otomatis mengembalikan id dan karenanya kita harus menunggu pesan balasan ditransfer ke seluruh jaringan.


Saya punya pertanyaan terkait: Jika menggunakan onewaykata kunci menyebabkan pesan tidak memblokir utas pemanggil saat metode yang dipanggil dijalankan, itu membuat metode yang dipanggil dieksekusi pada utas kedua. Bukankah itu multitasking (dalam bentuk yang paling sederhana)? Dapatkah saya menggunakan ini untuk melepaskan beberapa operasi kecil dengan cepat (tanpa banyak usaha) ke utas lain? Terima kasih banyak.
Constantino Tsarouhas

1
Tidak, tidak boleh. Dalam komputasi terdistribusi, utas dijalankan di mesin / proses yang berbeda. Anda dapat menggunakan performSelector: onThread: withObject: waitUntilDone: untuk tujuan Anda.
Freeman

2
Jadi apa yang terjadi dengan - (oneway void) releaseitu? Ini bukan di mesin atau proses lain.
Constantino Tsarouhas

+1 untuk menjelaskan tentang apa sebenarnya satu cara itu dengan tepat -> mendefinisikan one wayke suatu metode berarti don't wait for the method to complete and return anything. block it if there is any n/w trafic or so. Apakah saya masuk akal?
tanda musim panas
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.