도트(".") 연산자와 화살표("->") 연산자가 C와목표-C
C와 C의 사용법과 구문의 차이점에 대해 설명하겠습니다.목적-C특히 점 연산자와 화살표 연산자의 용도가 C와 왜 다른지 알고 싶습니다.목적-C여기 간단한 예가 있습니다.
C 코드:
// declare a pointer to a Fraction
struct Fraction *frac;
...
// reference an 'instance' variable
int n = (*frac).numerator; // these two expressions
int n = frac->numerator; // are equivalent
목표-C 코드:
// declare a pointer to a Fraction
Fraction *frac = [[Fraction alloc] init];
...
// reference an instance variable
int n = frac.numerator; // why isn't this (*frac).numerator or frac->numerator??
그래서 어떻게 보면frac
두 프로그램 모두 동일(즉, Fraction 객체 또는 구조에 대한 포인터)합니다.속성에 액세스할 때 다른 구문을 사용하는 이유는 무엇입니까?특히 C에서는numerator
속성에는frac->numerator
단, Objective-C에서는 점 연산자를 사용하여 액세스합니다.frac.numerator
.부터frac
두 프로그램 모두 포인터인데, 왜 이 표현들이 다를까요?누가 이것 좀 명확히 해줄래?
frac
두 프로그램 모두 동일하지 않습니다.
A CFraction
는 입니다.struct
이는 오버로드된 연산자가 없는 기본 유형이며 기본적으로만 구성 및 파괴할 수 있습니다.구조물에 함수 또는 필드를 정의하는 경우 에서 이러한 속성에 액세스하는 방법C
점과 함께(.
) 연산자.Objective-C는 사용자가 사용할 때 이 연산자를 유지합니다.struct
s. 화살표를 사용하여 참조 해제 및 도트 제거 작업을 수행할 수 있습니다.->
연산자(사용자가 언급한 두 개의 동등한 표현).Objective-C는 액세스 시에도 이 정보를 유지합니다.struct
s.
A 목적-CFraction
단, 당신의 예에서는 적어도 타입의 포인터일 가능성이 있다(추정할 수 있다).id
이것은 단순히 클래스 이름과 후드 아래에 있는 해당 클래스의 인스턴스에 대한 포인터입니다.또, 그 서브 클래스일 가능성이 매우 높다.NSObject
또는NSProxy
이러한 Objective-C 클래스는 특별한데, 그 이유는 이 클래스는 단순히 데이터 베이스 위에 사전 정의된 작업 레이어 전체를 가지고 있기 때문입니다.C
structure(정확히 파고들려면 Objective-C Runtime Reference를 참조해 주세요.또한 Objective-C 클래스는 항상 포인터입니다.
가장 기본적인 조작의1개는 입니다.이러한 유형의 오브젝트를 조작하면 Objective-C 컴파일러는 점을 해석합니다..
연산자 또는 대괄호 구문([object method]
)로서objc_msgSend
메서드 콜여기서 실제로 일어나는 일에 대한 자세한 내용은 Obj-C 런타임 개발을 감독하는 Apple 엔지니어 Bill Bumgarner의 이 게시물 시리즈를 참조하십시오.
화살표(->
) 연산자는 Objective-C 오브젝트에서는 사용할 수 없습니다.이미 말씀드렸듯이 Objective-C 클래스의 인스턴스는 통신 레이어가 추가된 C 구조이지만 화살표를 사용하면 해당 통신 레이어는 기본적으로 바이패스됩니다.예를 들어 Xcode를 열고 다음을 입력합니다.[UIApplication sharedApplication]->
다음으로 메서드 완료 목록을 표시합니다.
여기에서는 일반적으로 대괄호 구문을 사용하여 액세스하는 다수의 일반 필드를 볼 수 있습니다(예:[[UIApplication sharedApplication] delegate]
단, 이러한 특정 항목은C
각 Objective-C 속성 값을 저장하는 필드입니다.
대략 이렇게 생각할 수 있습니다.
C 객체의 점 연산자
- (실행 시) 필드의 반환값
C 객체의 화살표 연산자(포인트)
- 참조 해제 포인터
- 필드의 반환값
Objective-C 객체의 점 연산자/대괄호(포인트)
- (컴파일 시) 콜로 대체합니다.
objc_msgSend
- (실행 시) Obj-C 클래스 정의 조회, 잘못된 경우 예외 발생
- 참조 해제 포인터
- 필드의 반환값
Objective-C 객체의 화살표 연산자(포인트)
- (실행 시) 참조 해제 포인터
- 필드의 반환값
여기서 분명히 지나치게 단순화하지만 요약하자면 화살표 연산자는 두 경우 모두 기본적으로 동일한 작업을 수행하지만 점 연산자는 Objective-C에서 추가/다른 의미를 가집니다.
도트 표기는 설계상의 선택입니다.objc instance에 대한 포인터는 항상 취급하기 때문에 디자이너들은 기존의 프로그램도 깨지지 않는 익숙한 것을 원했다고 생각합니다.그것은 불과 몇 년 전 ObjC 2에서 소개되었다.이전에는 항상 대괄호를 사용하여 메시지를 보내야 했습니다.
그러나 도트 표기법은 차이가 있습니다. 직접 액세스가 아니라 메시지입니다.
즉, 다음과 같습니다.
obj.property = val;
// is the same as:
[obj setProperty:val];
// and not:
obj->property = val;
val = obj.property;
// is the same as:
val = [obj property];
// and not:
val = obj->property;
아직 쓸 수 있다obj->ivar
오브젝트 멤버 포인터에 액세스합니다(표시되는 경우).
첫 번째 예에서는Fraction
구조입니다.두 번째 예에서는Fraction
Objective-C 클래스입니다(iOS에서는 다음 서브클래스가 될 수 있습니다).NSObject
).
C++는 오버로드 할 수 없습니다.operator .
따라서 추가 정보 없이 도트 표기법은 C/C++ 정의 또는 오버로드 연산자가 아닌 Objective-C에 통합된 추가 언어 구성이라고 추론할 수 있습니다.
마침 도트 표기법은 구현자가 속성 접근의 약자로 선택한 설계 기능일 뿐이며, 대괄호 getter와 완전히 동일합니다.
myObjCVar.prop == [myObjCVar prop];
객체의 점 연산자는 객체의 속성에 액세스하기 위한 특별한 구문입니다.부동산의 취득자 또는 설정자를 배후에서 호출합니다.예를 들어,[@"hello" length]
그리고.@"hello".length
등가*입니다.다른 모든 유형의 경우 점은 C 점과 같고 화살표는 항상 동일합니다.
* 주의: 접근자 메서드는 속성과 동일한 이름이 될 수 없습니다.선언된 속성이고 선언에 특별한 getter 또는 setter 메서드가 지정되어 있는 경우 대신 해당 메서드가 사용됩니다.
점 표기법과 화살표 표기법은 C에서 Objective-C(의 엄밀한 슈퍼셋)와 동일합니다.나는 구별되어야 할 근본적인 차이는 구조와 오브젝티브-C 객체의 차이라고 생각한다.
Objective-C의 객체에 사용되는 점 표기법은 Objective-C 2.0에서 도입된 특성에 사용됩니다.단, 구조체에서는 Objective-C와 C 사이의 ->와 도트 표기는 동일합니다.
언급URL : https://stackoverflow.com/questions/9072688/dot-operator-and-arrow-operator-use-in-c-vs-objective-c
'source' 카테고리의 다른 글
JPA에서 List 유형의 속성을 유지하려면 어떻게 해야 합니까? (0) | 2022.08.21 |
---|---|
새로고침 시 Vue 라우터가 홈 페이지로 리디렉션됨 (0) | 2022.08.21 |
하위에서 스토어 변경을 트리거해도 스토어가 업데이트되지 않습니다. (0) | 2022.08.19 |
PDF 형식의 C89/C90 표준은 어디에서 찾을 수 있습니까? (0) | 2022.08.19 |
char* 포인터에는 문자열을 할당할 수 있지만 char[] 배열에는 할당할 수 없는 이유는 무엇입니까? (0) | 2022.08.19 |