Trường hợp sử dụng của `oneway void` trong Objective-C?


107

Tôi tìm thấy một từ khóa lạ trong NSObject.h

- (oneway void)release;

Tôi đã tìm kiếm trên web và biết được rằng nó liên quan đến việc truyền thông điệp không đồng bộ, trông giống với việc truyền thông điệp của Erlang.

Có vẻ như điều này có thể tạo ra nhiều điều thú vị. Một số trường hợp sử dụng tốt của từ khóa này là gì?


5
Dễ nhớ: oneway voidlà một trong những phép ẩn dụ tình cờ tuyệt đẹp mà đôi khi chúng ta thấy trong mã hóa, trong trường hợp này là cái chết. "Nếu bên kia có chuyện gì, đừng nói cho chúng ta."
xây dựng thành công

Câu trả lời:


110

onewayđược sử dụng với API đối tượng phân tán, cho phép sử dụng đối tượng mục tiêu-c giữa các luồng hoặc ứng dụng khác nhau. Nó cho hệ thống biết rằng nó không nên chặn luồng đang gọi cho đến khi phương thức trả về. Nếu không có nó, người gọi sẽ chặn, mặc dù kiểu trả về của phương thức là vô hiệu. Rõ ràng, nó không bao giờ được sử dụng với bất kỳ thứ gì khác ngoài void, vì làm như vậy có nghĩa là phương thức trả về một cái gì đó, nhưng người gọi không hiểu được.

Để biết thêm về các đối tượng phân tán, hãy xem Cocoa Conceptual DistrObjects .


6
Liên kết dường như không hoạt động nữa. Tôi không thể tìm thấy nó trong tài liệu của Apple nhưng tôi đã tìm thấy: chachatelier.fr/programmation/fichiers/cpp-objc-en.pdf cung cấp giải thích tốt về từ khóa "oneway". Xem phần 4.4.5 (pdf trang 24)
jlmendezbonini

@Robin Cảm ơn bạn đã cập nhật. Nó đã biến mất trong vài tháng qua, nhưng tôi không thể tìm thấy một tài liệu tham khảo khác từ Apple nên tôi đã để nó.
ughoavgfhw

và tôi nghĩ cách duy nhất để kích hoạt các tác vụ mạng là phân luồng chúng ... bằng cách sử dụng gcd_async và những người bạn của nó ..
Nirav Bhatt

18

Theo tài liệu của Apple, một chiều chỉ được sử dụng cho đối tượng phân tán (và không dùng cho đa luồng).

Công cụ sửa đổi một chiều chỉ được sử dụng nếu đối tượng ở xa. Trong trường hợp này, lệnh gọi phát hành có thể trả về không đồng bộ (trước khi phương thức kết thúc). Trong một mạng, điều đó có ý nghĩa vì việc chờ đợi một tin nhắn trả lại có thể mất một lúc.

Phương thức phát hành không có giá trị trả về và vì vậy việc gọi nó có thể được thực thi một cách không đồng bộ. Ngược lại, giữ lại và tự động vui lòng trả lại một id và do đó chúng tôi phải đợi thông báo trả lại được chuyển trong toàn mạng.


Tôi có một câu hỏi liên quan: Nếu việc sử dụng onewaytừ khóa khiến thông báo không chặn luồng đang gọi trong khi phương thức được gọi được thực thi, điều đó làm cho phương thức đã gọi được thực thi trên luồng thứ hai. Đó không phải là đa nhiệm (ở dạng đơn giản nhất) sao? Tôi có thể sử dụng điều này để tách một số thao tác nhỏ một cách nhanh chóng (mà không cần nhiều nỗ lực) sang một luồng khác không? Cảm ơn rât nhiều.
Constantino Tsarouhas

1
Không, bạn không thể. Trong máy tính phân phối, luồng được thực thi trong một máy / quy trình khác. Bạn có thể sử dụng PerformSelector: onThread: withObject: waitUntilDone: cho mục đích của bạn.
Freeman

2
Vậy điều gì xảy ra - (oneway void) releasesau đó? Nó không nằm trên một máy hoặc quy trình khác.
Constantino Tsarouhas

+1 để giải thích chính xác một cách là gì về chính xác -> xác định one waytheo một phương pháp có nghĩa là don't wait for the method to complete and return anything. block it if there is any n/w trafic or so. Tôi có hiểu không?
thesummersign
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.