Use-case of `oneway void` ใน Objective-C?


107

ฉันพบคีย์เวิร์ดแปลก ๆ ใน NSObject.h

- (oneway void)release;

ฉันค้นหาเว็บและเรียนรู้ว่ามันเกี่ยวข้องกับการส่งข้อความแบบอะซิงโครนัสซึ่งดูคล้ายกับการส่งข้อความของ Erlang

ดูเหมือนว่าสิ่งนี้สามารถสร้างสิ่งที่น่าสนใจมากมาย คำหลักนี้มีลักษณะการใช้งานที่ดีอะไรบ้าง


5
ง่ายต่อการจดจำ: oneway voidเป็นคำเปรียบเปรยโดยบังเอิญที่สวยงามอย่างหนึ่งที่บางครั้งเราเห็นในการเขียนโค้ดในกรณีนี้สำหรับความตาย "ถ้ามีอะไรอีกด้านอย่าบอกเรานะ"
สร้างเสร็จ

คำตอบ:


111

onewayใช้กับ API อ็อบเจ็กต์แบบกระจายซึ่งอนุญาตให้ใช้อ็อบเจ็กต์วัตถุประสงค์ -c ระหว่างเธรดหรือแอ็พพลิเคชันต่างๆ เป็นการบอกระบบว่าไม่ควรบล็อกเธรดการเรียกจนกว่าเมธอดจะกลับมา หากไม่มีผู้โทรจะบล็อกแม้ว่าประเภทการส่งคืนของเมธอดจะเป็นโมฆะ เห็นได้ชัดว่ามันไม่เคยใช้กับสิ่งอื่นนอกจากโมฆะเนื่องจากการทำเช่นนั้นจะหมายถึงวิธีการส่งคืนบางสิ่ง แต่ผู้โทรไม่เข้าใจ

สำหรับข้อมูลเพิ่มเติมเกี่ยววัตถุกระจายดูโกโก้ DistrObjects


6
ดูเหมือนว่าลิงก์จะใช้งานไม่ได้อีกต่อไป ฉันไม่พบในเอกสารของ Apple แต่พบว่า: chachatelier.fr/programmation/fichiers/cpp-objc-en.pdfซึ่งให้คำอธิบายที่ดีเกี่ยวกับคีย์เวิร์ด "oneway" ดูหัวข้อ 4.4.5 (pdf หน้า 24)
jlmendezbonini

@Robin ขอบคุณสำหรับการอัปเดต มันหายไปในช่วงสองสามเดือนที่ผ่านมา แต่ฉันไม่พบข้อมูลอ้างอิงอื่นจาก Apple ดังนั้นฉันจึงทิ้งมันไว้
ughoavgfhw

และฉันคิดว่าวิธีเดียวที่จะทำให้งานเครือข่ายเริ่มทำงานได้คือการย่อยเธรด ... โดยใช้ gcd_async และเพื่อน ๆ ..
Nirav Bhatt

18

ตามเอกสารของ Apple oneway ใช้สำหรับวัตถุแบบกระจายเท่านั้น (ไม่ใช่สำหรับมัลติเธรด)

ตัวปรับแต่งแบบ oneway จะใช้เฉพาะในกรณีที่วัตถุอยู่ห่างไกล ในกรณีนี้การเรียกรีลีสสามารถส่งคืนแบบอะซิงโครนัสได้ (ก่อนที่เมธอดจะสิ้นสุด) ในเครือข่ายเป็นเรื่องที่สมเหตุสมผลเนื่องจากการรอข้อความส่งคืนอาจใช้เวลาสักครู่

วิธีการรีลีสไม่มีค่าส่งคืนดังนั้นจึงเรียกได้ว่าสามารถดำเนินการแบบอะซิงโครนัสได้ ในทางตรงกันข้ามการเก็บรักษาและรีลีสอัตโนมัติจะส่งคืน id ดังนั้นเราจึงต้องรอให้ข้อความส่งกลับถูกโอนไปทั่วทั้งเครือข่าย


ฉันมีคำถามที่เกี่ยวข้อง: หากการใช้onewayคีย์เวิร์ดทำให้ข้อความไม่บล็อกเธรดการโทรในขณะที่เรียกใช้เมธอดนั่นทำให้เมธอดที่เรียกนั้นถูกเรียกใช้ในเธรดที่สอง การทำงานหลายอย่างพร้อมกันนั้นไม่ใช่หรือ (ในรูปแบบที่ง่ายที่สุด) ฉันสามารถใช้สิ่งนี้เพื่อแยกการทำงานเล็ก ๆบางอย่างอย่างรวดเร็ว (โดยไม่ต้องออกแรงมาก) ไปยังเธรดอื่นได้หรือไม่ ขอบคุณมาก.
Constantino Tsarouhas

1
ไม่คุณทำไม่ได้ ในการกระจายการคำนวณเธรดจะดำเนินการในเครื่อง / กระบวนการอื่น คุณสามารถใช้ performSelector: onThread: withObject: waitUntilDone: เพื่อวัตถุประสงค์ของคุณ
Freeman

2
แล้วจะเกิดอะไรขึ้น- (oneway void) release? ไม่ได้อยู่ในเครื่องหรือกระบวนการอื่น
Constantino Tsarouhas

+1 สำหรับการอธิบายว่าทางเดียวคืออะไร -> การกำหนดone wayวิธีการหมายถึง don't wait for the method to complete and return anything. block it if there is any n/w trafic or so. ฉันเหมาะสมหรือไม่?
thesummersign
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.