Вариант использования `oneway void` в Objective-C? - PullRequest
105 голосов
/ 31 марта 2011

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

- (oneway void)release;

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

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

Ответы [ 3 ]

108 голосов
/ 31 марта 2011

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

Подробнее о распределенных объектах см. Концептуальные объекты Какао DistrObjects .

38 голосов
/ 30 июля 2011

Также необходимо устранить предупреждение с помощью XCode 4.2 (LLVM).В частности:

-(void) release { }

выдает следующее предупреждение в XCode 4.2 (с LLVM):

предупреждение: семантическая проблема: конфликт модификаторов распределенных объектов по типу возврата в реализации 'release'

Предупреждение можно устранить, добавив модификатор oneway:

-(oneway void) release { }

Это в реализации синглтона, поэтому релиз действительно ничего не делает.

Это необходимо (по крайней мере, для устранения предупреждения) на iOS, а также на OS X. Протокол NSObject в документации iOS определяет выпуск как (односторонний недействительный), хотя в iOS нет распределенных объектов.Похоже, что LLVM поднимает это, а GCC нет.

18 голосов
/ 04 июля 2011

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

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

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

...