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/ 을 읽고 이러한 주석의 의미를 이해할 수 있습니다 .
'Programing' 카테고리의 다른 글
"어셈블리"대 "어셈블러" (0) | 2020.11.28 |
---|---|
NULL / 0을 dynamic_cast에 전달하는 것이 이식 가능합니까? (0) | 2020.11.28 |
BSTR에서 std :: string (std :: wstring)으로 또는 그 반대로 (0) | 2020.11.28 |
git 저장소 이동 (0) | 2020.11.28 |
하나의 유닛이 .NET MVC 컨트롤러를 어떻게 테스트해야합니까? (0) | 2020.11.28 |