ProgramingTip

점 ( ".") 연산자와 화살표 ( "->") 연산자는 C와 Objective-C에서 사용됩니다.

bestdevel 2020. 12. 1. 19:13
반응형

점 ( ".") 연산자와 화살표 ( "->") 연산자는 C와 Objective-C에서 사용됩니다.


나는 C와 Objective-C의 사용법과 구문의 차이점에 대해 머리를 찾고 노력하고 있습니다. 특히 C와 Objective-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

Objective-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 실제로 두 프로그램에서 동일하지 않습니다.

AC Fractionstruct오버로드 된 연산자가없는 기본 유형이며 기본적으로 만 실제로 생성 및 소멸 될 수 있습니다. 은 도트에서 함수 나 필드를 정의하는 경우 속성에 액세스하는 방법 C은 도트 ( .) 연산자를 사용하는 것입니다. Objective-C는 structs 를 사용할 때이 연산자를 유지합니다 . 편의를 위해 화살표 ( ->) 연산자 (당신이 참조 한 두 개의 참조 및 점 연산을 수행 할 수 있습니다) . Objective-C는 structs에 액세스 할 때 관리자를 유지합니다 .

Fraction그러나 귀하의 예제에서 Objective-C 는 아마도 최소한 유형의 포인터 일 것입니다 id. 이것은 클래스 이름과 내부에서 해당 클래스의 인스턴스에 대한 포인터입니다. 또한 NSObject또는 의 하위 클래스 일 가능성이 매우 높은 NSProxy. Objective-C 클래스는 C아래 미리 정의 된 작업의 전체 계층이 수준 점에서 특별 합니다 (정말 자세히 알아 보기 Objective-C 실행 참조를 살펴볼 수 있습니다 ). 또한 주목해야 할 중요한 점은 Objective-C 클래스는 항상 포인터 입니다.

가장 기본적인 작업 중 하나는 입니다. Objective-C 컴파일러는 도트 ( ) 연산자 또는 대괄호 구문 ( )을 메서드 호출 해석합니다 . 여기서 일어나는 일에 대한 자세한 정보 는 Obj-C 런타임 개발을 감독하는 Apple 엔지니어 인 Bill Bumgarner 의이 게시물 시리즈를 참조하십시오 .objc_msgSend.[object method]objc_msgSend

화살표 ( ->) 연산자는 Objective-C에서 사용하지 않습니다. Objective-C 클래스 인스턴스는 추가 통신 계층이 추가 된 C 통신 계층을 사용합니다. 예를 들어 Xcode를 입력 [UIApplication sharedApplication]->한 다음 메소드 완성 목록을 불러 오면 다음과 같이 표시됩니다.

화살표 연산자를 사용할 때 Obj-C의 내부 ivar 목록

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

당신은 다음과 같이 생각할 수 있습니다.

C의 도트 연산자

  1. (런타임에) 필드의 반환 값

C의 화살표 연산자 (포인터)

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

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

  1. (컴파일 시간에) 다음 호출로 objc_msgSend
  2. (런타임에) Obj-C 클래스 정의를 찾아보고 문제가 발생하면 예외를 throw
  3. 역 참조 포인터
  4. 필드의 반환 값

Objective-C 개체의 화살표 연산자 (포인터)

  1. (런타임에) 역 참조 포인터
  2. 필드의 반환 값

이제 저는 분명히 지나치게 단순화하고 있지만 요약하면 화살표 연산자는 기본적으로 두 경우 모두 동일한 작업을 수행하는 것처럼 보이지만 점 연산자는 Objective-C에서 추가 / 다른 의미를 갖습니다.


점 표기법은 디자인 선택입니다. 우리는 항상 objc 인스턴스에 대한 포인터를 다루기 때문에 디자이너는 기존 프로그램을 손상시키지 않는 친숙한 것을 원했다고 생각합니다. 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];

객체의 도트 연산자는 객체의 속성에 액세스하기위한 특수 구문입니다. 뒤에서 속성의 getter 또는 setter를 호출합니다. 예를 들어, [@"hello" length]@"hello".length동일합니다 *. 다른 모든 유형의 경우 점은 C 점과 동일하고 화살표는 항상 동일합니다.

* 참고 : 접근 자 메서드의 이름이 항상 속성과 동일한 것은 아닙니다. 선언 된 속성이고 선언이 특수 getter 또는 setter 메서드를 지정하는 경우 해당 메서드가 대신 사용됩니다.


점과 화살표 표기법은 Objective-C (엄격한 수퍼 세트)에서와 마찬가지로 C에서도 동일합니다. 구분해야 할 근본적인 차이점은 구조체와 Objective-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

반응형