Programing

Objective-C in, out, inout, byref, byval, .. 등등.

lottogame 2020. 11. 28. 08:34
반응형

Objective-C in, out, inout, byref, byval, .. 등등. 그들은 무엇인가?


.NET 용 Objective-C 매뉴얼을 읽는 동안 낯선 것을 발견했습니다 @encoding.

Table 6-2  Objective-C method encodings
Code Meaning
r    const
n    in
N    inout
o    out
O    bycopy
R    byref
V    oneway

내가 아는 유일한 것은 oneway. 다른 것은 무엇입니까?


이는 분산 개체에서 사용 된 메서드 매개 변수 및 반환 값에 대한 주석입니다. 나는 분명히 애플의 문서에 더 이상 그 흔적 없기 때문 이라고 말했다 . Objective-C 프로그래밍 언어 문서에 원격 메시징 섹션이 있었는데 이는 여전히 분산 객체 프로그래밍 주제 문서에서 참조하고 있습니다.

  • in : 인수는 입력 인수 일 뿐이며 나중에 참조되지 않습니다.
  • out : 인수는 출력 인수이며 참조로 값을 반환하는 데 사용됩니다.
  • inout : 인수는 입력 및 출력 인수입니다.
  • const : (포인터) 인수는 상수입니다.
  • bycopy : proxy /를 사용하는 대신 NSDistantObject객체의 복사본을 전달하거나 반환합니다.
  • byref : 프록시 객체 사용 (기본값)

분산 객체 외에도 이러한 주석 중 하나가 ARC에서 사용되는 것으로 보입니다. 나는 writeback으로 out 매개 변수에 전달하는 clang의 설명에서 다음을 발견했습니다 .

매개 변수가 표시 오브젝티브 C 방법 파라미터가 아닌 경우 out, 다음 *p판독하고, 그 결과 원시 의미론 일시적으로 기입된다.

이것은 같은 방법과 관련이 - (BOOL)executeWithError:(out NSError **)error있습니다.

out키워드를 무시하면 ARC는 참조에 의한 객체 전달을로 처리__autoreleasing 하는 잘 정의 된 동작을 가지고 있으므로 ARC는 error매개 변수를 유형이 NSError * __autoreleasing *. 정규화 된 변수를 사용하는 경우 ARC는 임시 자동 해제 변수 전달을 함수에 추가합니다 (일관성을 위해).

원래 코드

NSError *error;
[obj executeWithError:&error];

의사 변환 코드

NSError * __strong error;
NSError * __autoreleasing temp;
temp = error;
[obj executeWithError:&temp];
error = temp;

위의 코드 temp = error를 사용 temp하면 결코 읽히지 않을 것이라는 것을 어떻게 든 알 수 있다면 이 필요 하지 않을 것입니다. 여기에서 out주석이 작동합니다. 인용 된 설명에 out따라 컴파일러는 줄을 추가해야 temp = error하지만 포함 된 경우 out을 제외하고 코드를 조금 더 작게 / 빠르게 만들 수 있습니다. out변환 된 코드가된다 :

NSError * __strong error;
NSError * __autoreleasing temp;
[obj executeWithError:&temp];
error = temp;

물론 바이너리 크기와 속도가 그렇게 걱정된다면 다음과 같이 코딩해야합니다.

NSError * __autoreleasing error;
[obj executeWithError:&error];

이러한 주석은 컴파일러 및 런타임 전체에서 다른 위치에서 사용되며 향후 더 많은 위치에서 사용될 수 있습니다. 개인적으로 저는 out값을 읽지 않겠다는 다른 개발자들에게 힌트로 사용 하는 것을 좋아합니다.


누군가가이 게시물을 우연히 발견하고 나와 같은 혼란을 겪고 있다면 'in'인수는 빠른 열거를 나타내는 키워드가 될 수도 있습니다. 자세한 내용은 여기 를 참조하십시오.


Objective-C 런타임 소스 http://www.opensource.apple.com/source/objc4/objc4-437.1/읽고 이러한 주석의 의미를 이해할 수 있습니다 .

참고 URL : https://stackoverflow.com/questions/5609564/objective-c-in-out-inout-byref-byval-and-so-on-what-are-they

반응형