점 ( ".") 연산자와 화살표 ( "->") 연산자는 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 Fraction
는 struct
오버로드 된 연산자가없는 기본 유형이며 기본적으로 만 실제로 생성 및 소멸 될 수 있습니다. 은 도트에서 함수 나 필드를 정의하는 경우 속성에 액세스하는 방법 C
은 도트 ( .
) 연산자를 사용하는 것입니다. Objective-C는 struct
s 를 사용할 때이 연산자를 유지합니다 . 편의를 위해 화살표 ( ->
) 연산자 (당신이 참조 한 두 개의 참조 및 점 연산을 수행 할 수 있습니다) . Objective-C는 struct
s에 액세스 할 때 관리자를 유지합니다 .
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]->
한 다음 메소드 완성 목록을 불러 오면 다음과 같이 표시됩니다.
여기에서는 일반적으로 대괄호 구문 (예 :)으로 액세스하는 일반 필드를 볼 수 있습니다 [[UIApplication sharedApplication] delegate]
. 그러나 그러나 특정 특정 항목 C
은 각각의 Objective-C 속성 값을 저장하는 필드입니다.
당신은 다음과 같이 생각할 수 있습니다.
C의 도트 연산자
- (런타임에) 필드의 반환 값
C의 화살표 연산자 (포인터)
- 역 참조 포인터
- 필드의 반환 값
Objective-C 개체 (포인터)의 점 연산자 / 대괄호
- (컴파일 시간에) 다음 호출로
objc_msgSend
- (런타임에) Obj-C 클래스 정의를 찾아보고 문제가 발생하면 예외를 throw
- 역 참조 포인터
- 필드의 반환 값
Objective-C 개체의 화살표 연산자 (포인터)
- (런타임에) 역 참조 포인터
- 필드의 반환 값
이제 저는 분명히 지나치게 단순화하고 있지만 요약하면 화살표 연산자는 기본적으로 두 경우 모두 동일한 작업을 수행하는 것처럼 보이지만 점 연산자는 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
구조체입니다. 두 번째 예에서는 Fraction
Objective-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
'ProgramingTip' 카테고리의 다른 글
정규식 단어 일치 (0) | 2020.12.01 |
---|---|
자바 커스텀 생성 화 (0) | 2020.12.01 |
Permgen 크기를 선택 설정해야합니까? (0) | 2020.12.01 |
UIView의 콘텐츠 압축 저항 및 콘텐츠 포옹은 무엇입니까? (0) | 2020.12.01 |
git ignore vs. exclude vs. assume-unchanged (0) | 2020.12.01 |