Objective-C에서`oneway void`의 사용 사례?


107

NSObject.h에서 이상한 키워드를 찾았습니다.

- (oneway void)release;

나는 웹을 검색했고 그것이 Erlang의 메시지 전달과 비슷해 보이는 비동기 메시지 전달과 관련이 있다는 것을 알게되었습니다.

이것은 많은 흥미로운 것들을 만들 수있는 것 같습니다. 이 키워드의 좋은 사용 사례는 무엇입니까?


5
기억하기 쉬움 : oneway void코딩에서 가끔 볼 수있는 아름다운 우연한 은유 중 하나입니다. "다른쪽에있는 것이 있으면 우리에게 말하지 마십시오."
2013

답변:


110

oneway분산 객체 API와 함께 사용되어 서로 다른 스레드 또는 응용 프로그램간에 Objective-C 객체를 사용할 수 있습니다. 메서드가 반환 될 때까지 호출 스레드를 차단해서는 안된다고 시스템에 알립니다. 이것이 없으면 메서드의 반환 유형이 무효 인 경우에도 호출자는 차단됩니다. 분명히 void 이외의 다른 것과 함께 사용되지는 않습니다. 그렇게하면 메서드가 무언가를 반환하지만 호출자는 그것을 얻지 못합니다.

분산 객체에 대한 자세한 내용은 Cocoa 개념적 DistrObjects를 참조하십시오 .


6
링크가 더 이상 작동하지 않는 것 같습니다. Apple 문서에서는 찾을 수 없었지만 "oneway"키워드에 대한 좋은 설명을 제공하는 chachatelier.fr/programmation/fichiers/cpp-objc-en.pdf 를 찾았습니다 . 섹션 4.4.5 (pdf 24 페이지) 참조
jlmendezbonini

@Robin 업데이트 해 주셔서 감사합니다. 지난 몇 달 동안 사라졌지 만 Apple에서 다른 참고 자료를 찾을 수 없어서 그대로 두었습니다.
ughoavgfhw 2011

네트워크 작업을 실행하는 유일한 방법은 gcd_async와 그 친구들을 사용하여 하위 스레드를 만드는 것이라고 생각했습니다.
Nirav Bhatt

18

Apple의 문서에 따르면 oneway는 분산 객체에만 사용되며 멀티 스레딩에는 사용되지 않습니다.

단방향 수정자는 오브젝트가 원격 인 경우에만 사용됩니다. 이 경우 릴리스 호출은 메서드가 종료되기 전에 비동기 적으로 반환 될 수 있습니다. 네트워크에서는 리턴 메시지를 기다리는 데 시간이 걸릴 수 있기 때문에 의미가 있습니다.

릴리스 메서드에는 반환 값이 없으므로 호출을 비동기 적으로 실행할 수 있습니다. 대조적으로, 보유 및 자동 해제는 ID를 리턴하므로 리턴 메시지가 네트워크를 통해 전송 될 때까지 기다려야합니다.


관련 질문이 있습니다. oneway키워드를 사용하면 호출 된 메서드가 실행되는 동안 메시지가 호출 스레드를 차단하지 않는 경우 호출 된 메서드가 두 번째 스레드에서 실행됩니다. (가장 단순한 형태의) 멀티 태스킹 아닌가요? 이것을 사용하여 일부 작은 작업을 다른 스레드로 빠르게 분리 할 수 ​​있습니까 ? 대단히 감사합니다.
Constantino Tsarouhas 2011

1
아니, 할 수 없습니다. 분산 컴퓨팅에서 스레드는 다른 시스템 / 프로세스에서 실행됩니다. 목적을 위해 performSelector : onThread : withObject : waitUntilDone :을 사용할 수 있습니다.
Freeman

2
그럼 어떻게 - (oneway void) release되나요? 다른 컴퓨터 나 프로세스에 있지 않습니다.
Constantino Tsarouhas 2011

정확히 한 가지 방법이 정확히 무엇인지 설명하는 +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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.