내 질문은 이것입니다. 언제 #import를 사용하고 언제 @class를 사용합니까?
간단한 대답 : 귀하 #import
또는 #include
신체적 의존성이있을 때. 그렇지 않으면, 당신은 앞으로 선언을 사용 ( @class MONClass
, struct MONStruct
, @protocol MONProtocol
).
신체적 의존성에 대한 일반적인 예는 다음과 같습니다.
- C 또는 C ++ 값 (포인터 또는 참조는 물리적 종속성이 아님)
CGPoint
ivar 또는 속성으로 a 를 사용하는 경우 컴파일러에서의 선언을 확인해야합니다 CGPoint
.
- 당신의 슈퍼 클래스.
- 사용하는 방법.
@class 선언을 사용하는 경우 때때로 다음과 같은 일반적인 컴파일러 경고가 표시됩니다. "경고 : 수신자 'FooController'는 순방향 클래스이며 해당 @interface가 없을 수 있습니다."
컴파일러는 이와 관련하여 실제로 매우 관대합니다. 힌트 (예 : 위와 같은)를 제거하지만 스택을 무시하고 #import
올바르게 처리 하지 않으면 스택을 쉽게 휴지통에 버릴 수 있습니다 . 비록 (IMO)하더라도 컴파일러는 이것을 강제하지 않습니다. ARC에서 컴파일러는 참조 카운팅을 담당하므로 더 엄격합니다. 무슨 일이 일어나는지는 컴파일러가 알 수없는 메소드를 만나면 기본값으로 돌아갑니다. 모든 반환 값과 매개 변수는로 가정합니다 id
. 따라서 코드베이스의 모든 경고를 근절해야합니다. 이는 물리적 종속성으로 간주되어야하기 때문입니다. 이것은 선언되지 않은 C 함수를 호출하는 것과 유사합니다. C를 사용하면 매개 변수는로 간주됩니다 int
.
전방 선언을 선호하는 이유는 최소한의 의존성이 있기 때문에 요인으로 빌드 시간을 줄일 수 있기 때문입니다. 정방향 선언을 사용하면 컴파일러는 이름이 있음을 확인하고 물리적 종속성이 없을 때 클래스 선언이나 모든 종속성을 보지 않고도 프로그램을 올바르게 구문 분석하고 컴파일 할 수 있습니다. 깨끗한 빌드는 시간이 덜 걸립니다. 증분 빌드는 시간이 덜 걸립니다. 물론, 필요한 모든 헤더가 결과적으로 모든 번역에 표시되도록하는 데 약간의 시간이 더 걸리지 만, 빌드 시간이 단축됩니다 (프로젝트가 작지 않다고 가정).
#import
또는 #include
대신 사용 하면 필요한 것보다 컴파일러에서 더 많은 작업을 수행합니다. 복잡한 헤더 종속성도 도입하고 있습니다. 이것을 무차별 알고리즘에 비유 할 수 있습니다. 당신이 때 #import
, 당신은 메모리, 디스크 분석하고 소스를 컴파일하는 I / O 및 CPU를 많이 필요로 불필요한 정보의 톤에 드래그하고 있습니다.
ObjC는 NSObject
타입이 결코 값이 아니기 때문에 의존성 측면에서 C 기반 언어에 이상적입니다. NSObject
타입은 항상 참조 카운트 포인터입니다. 따라서 물리적 종속성이 거의 없기 때문에 프로그램의 종속성을 적절하게 구성하고 가능한 경우 앞으로 컴파일하면 엄청나게 빠른 컴파일 시간을 피할 수 있습니다. 종속성을 추가로 최소화하기 위해 클래스 확장에서 속성을 선언 할 수도 있습니다. 이는 대규모 시스템의 경우 큰 보너스입니다. 대규모 C ++ 코드베이스를 개발 한 경우의 차이점을 알게 될 것입니다.
따라서 가능한 경우 전달을 사용하고 #import
물리적 의존성이있는 곳을 사용하는 것이 좋습니다 . 물리적 의존성을 의미하는 경고 또는 다른 경고가 표시되면 모두 수정하십시오. 수정 사항은 #import
구현 파일에 있습니다.
라이브러리를 빌드 할 때 일부 인터페이스를 그룹으로 분류 할 #import
수 있습니다.이 경우 물리적 종속성이 도입 된 라이브러리 (예 :)가 #import <AppKit/AppKit.h>
됩니다. 이것은 의존성을 유발할 수 있지만, 라이브러리 관리자는 종종 필요에 따라 물리적 의존성을 처리 할 수 있습니다. 기능을 도입하면 빌드에 미치는 영향을 최소화 할 수 있습니다.