source

도트(".") 연산자와 화살표("->") 연산자가 C와목표-C

gigabyte 2022. 8. 21. 19:48
반응형

도트(".") 연산자와 화살표("->") 연산자가 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는 사용자가 사용할 때 이 연산자를 유지합니다.structs. 화살표를 사용하여 참조 해제 및 도트 제거 작업을 수행할 수 있습니다.->연산자(사용자가 언급한 두 개의 동등한 표현).Objective-C는 액세스 시에도 이 정보를 유지합니다.structs.

A 목적-CFraction단, 당신의 예에서는 적어도 타입의 포인터일 가능성이 있다(추정할 수 있다).id이것은 단순히 클래스 이름과 후드 아래에 있는 해당 클래스의 인스턴스에 대한 포인터입니다.또, 그 서브 클래스일 가능성이 매우 높다.NSObject또는NSProxy이러한 Objective-C 클래스는 특별한데, 그 이유는 이 클래스는 단순히 데이터 베이스 위에 사전 정의된 작업 레이어 전체를 가지고 있기 때문입니다.Cstructure(정확히 파고들려면 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]->다음으로 메서드 완료 목록을 표시합니다.

A list of internal ivars on an Obj-C object when using the arrow operator

여기에서는 일반적으로 대괄호 구문을 사용하여 액세스하는 다수의 일반 필드를 볼 수 있습니다(예:[[UIApplication sharedApplication] delegate]단, 이러한 특정 항목은C각 Objective-C 속성 값을 저장하는 필드입니다.

대략 이렇게 생각할 수 있습니다.

C 객체의 점 연산자

  1. (실행 시) 필드의 반환값

C 객체의 화살표 연산자(포인트)

  1. 참조 해제 포인터
  2. 필드의 반환값

Objective-C 객체의 점 연산자/대괄호(포인트)

  1. (컴파일 시) 콜로 대체합니다.objc_msgSend
  2. (실행 시) Obj-C 클래스 정의 조회, 잘못된 경우 예외 발생
  3. 참조 해제 포인터
  4. 필드의 반환값

Objective-C 객체의 화살표 연산자(포인트)

  1. (실행 시) 참조 해제 포인터
  2. 필드의 반환값

여기서 분명히 지나치게 단순화하지만 요약하자면 화살표 연산자는 두 경우 모두 기본적으로 동일한 작업을 수행하지만 점 연산자는 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구조입니다.두 번째 예에서는FractionObjective-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

반응형