Случай использования "oneway void" в Objective-C?



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



- (oneway void)release;


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



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

674   3  

3 ответов:

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

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

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

-(void) release { }

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

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

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

-(oneway void) release { }

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

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

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

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

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

Comments

    Ничего не найдено.