Пример использования oneeway void в Objective-C?


107

Я нашел странное ключевое слово в NSObject.h

- (oneway void)release;

Я поискал в Интернете и узнал, что это связано с асинхронной передачей сообщений, которая похожа на передачу сообщений в Erlang.

Кажется, из этого можно сделать много интересного. Каковы хорошие варианты использования этого ключевого слова?


5
Легко запомнить: oneway voidэто одна из тех красивых случайных метафор, которые мы иногда видим в кодировании, в данном случае смерти. «Если есть что-нибудь на другой стороне, не говори нам».
buildsucceeded

Ответы:


111

onewayиспользуется с API распределенных объектов, что позволяет использовать объекты objective-c между различными потоками или приложениями. Он сообщает системе, что она не должна блокировать вызывающий поток, пока метод не вернется. Без него вызывающий блок будет заблокирован, даже если тип возвращаемого значения метода недействителен. Очевидно, он никогда не используется ни с чем, кроме void, так как это будет означать, что метод что-то возвращает, но вызывающий не получает этого.

Для получения дополнительной информации о распределенных объектах см. Концептуальные объекты DistrObjects какао .


6
Ссылка больше не работает. Мне не удалось найти его в документации Apple, но я нашел: chachatelier.fr/programmation/fichiers/cpp-objc-en.pdf, который дает хорошее объяснение ключевого слова «односторонний». См. Раздел 4.4.5 (pdf стр. 24)
jlmendezbonini

@Robin Спасибо за обновление. Его не было в течение последних нескольких месяцев, но я не смог найти другого справочника от Apple, поэтому просто оставил его.
ughoavgfhw

и я подумал, что единственный способ запускать сетевые задачи - это подпрограммировать их ... с помощью gcd_async и его друзей ..
Нирав Бхатт

18

Согласно документации Apple, oneway используется только для распределенного объекта (а не для многопоточности).

Модификатор oneway используется только в том случае, если объект удален. В этом случае вызов освобождения может возвращаться асинхронно (до завершения метода). В сети это имеет смысл, потому что ожидание ответного сообщения может занять некоторое время.

Метод выпуска не имеет возвращаемого значения, поэтому его вызов может выполняться асинхронно. Напротив, при сохранении и автоматическом выпуске идентификатор возвращается, поэтому нам приходится ждать, пока ответное сообщение не будет передано по сети.


У меня есть связанный с этим вопрос: если использование onewayключевого слова заставляет сообщение не блокировать вызывающий поток во время выполнения вызываемого метода, это заставляет вызываемый метод выполняться во втором потоке. Разве это не многозадачность (в простейшей форме)? Могу ли я использовать это для быстрого (без особых усилий) отделения некоторых небольших операций от другого потока? Большое спасибо.
Константино Царухас

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

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. Имею ли я смысл?»
thesummersign
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.