Випадок використання `oneway void` в Objective-C?


107

Я знайшов дивне ключове слово в NSObject.h

- (oneway void)release;

Я здійснив пошук в Інтернеті і дізнався, що це стосується асинхронного передавання повідомлення, що схоже на передачу повідомлення Ерланга.

Здається, це може зробити багато цікавого. Які хороші випадки використання цього ключового слова?


5
Легко запам’ятати: oneway voidодна з тих прекрасних випадкових метафор, які ми іноді бачимо в кодуванні, в даному випадку - на смерть. "Якщо з іншого боку є щось, не кажіть нам".
buildsucced

Відповіді:


110

onewayвикористовується з API розподілених об'єктів, що дозволяє використовувати об'єкти target-c між різними потоками чи програмами. Він повідомляє системі, що вона не повинна блокувати виклик потоку, поки метод не повернеться. Без цього виклик буде блокувати, навіть якщо тип повернення методу недійсний. Очевидно, що він ніколи не використовується нічим іншим, крім порожнечі, оскільки це буде означати, що метод щось повертає, але абонент цього не отримує.

Докладніше про розподілені об'єкти див. У Концептуальних поняттях DistrObjects Cocoa .


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ключового слова призводить до того, що повідомлення не блокує потоковий виклик, поки виконується викликаний метод, це робить метод виклику виконуватись на другому потоці. Хіба це не багатозадачність (у найпростішому вигляді)? Чи можу я скористатися цим, щоб швидко (без особливих зусиль) відключити деякі невеликі операції до іншої теми? Велике спасибі.
Константіно Царухас

1
Ні, ти не можеш. При розподілі обчислень нитка виконується в іншій машині / процесі. Ви можете використовувати performSelector: onThread: withObject: waitUntilDone: для ваших цілей.
Фріман

2
То що ж відбувається з - (oneway void) releaseтоді? Це не на іншій машині чи процесі.
Константіно Царухас

+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. чи я маю сенс?
літо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.