2011-03-21 3 views
2

Objective-C 및 기타 c 기반 언어 학습 #includes와 #imports를 헤더 파일에 넣어야한다는 것을 알았습니다. 그리고 @class도 거기에 있습니다. 최근에 사과와 웹 소스 코드의 예제 코드를 보면 @class가 헤더에 있고 모든 가져 오기가 구현 파일에 있습니다.구현 파일에 #import를 포함 할시기

올바른 내용은 무엇입니까? 둘 다 이유가 있습니까? 또한 헤더 파일을 가져 오는 경우 @class 선언을 제공해야하는 이유는 무엇입니까?

+1

+0

@Sherm, good 발견. –

답변

7

두 경우 모두 "보다 정확합니다."두 가지 경우 모두 분명히 이유가 있습니다.

ClassA.h :

@interface ClassA : NSObject 
{ 
    ClassB *b; 
} 

ClassB.h :

@interface ClassB : NSObject 
{ 
    ClassA *a; 
} 
예를 들어, 다른 형식의 개체에 대한 참조가 두 개의 클래스를 가지고있는 경우, 각각에 대해 생각

이 코드는 컴파일되지 않습니다.이 헤더에는 순환 종속성이 있습니다. 해결책은 @class 지시문을 사용하여 필수 클래스를 선언하는 것입니다.

헤더 파일에서 #import 지시어를 선호하는 상황은 다른 헤더에서 신경 쓰는 클래스 이름 외에 일반적인 코드 (예 : C 스타일 함수 또는 열거 형 등)가있는 경우 일 수 있습니다.

+0

내가 찾은 가장 좋은 답변은 +250의 다른 주제보다 나에게 더 좋습니다! Carl 감사합니다! – Paul

2

학습 목표 -C 및 기타 c 기반 언어 #includes와 #imports를 헤더 파일에 넣어야한다는 것을 알게되었습니다.

아니요 - 기반 언어는 아닙니다. 가능한 경우 구현 파일에 입력해야합니다. 당신은 항상 zero-dependency 헤더를 생성 할 수는 없지만 그것을 최소화해야한다.

기반 언어는 특히 종속성과 포함이 매우 복잡하거나 불필요한 포함 (우연히 더 많은 종속성 도입)이있는 경우 컴파일하는 데 시간이 오래 걸립니다.

@ 클래스도 거기에 있습니다. 최근에 사과와 웹 소스 코드의 예제 코드를 보면 @class가 헤더에 있고 모든 가져 오기가 구현 파일에 있습니다. 어느 것이 맞습니까?

사용 앞으로 선언 (@class NAME;, @protocol NAME;, struct NAME, 클래스 이름,`등) 어디든지 당신이 할 수있는.

둘 다 이유가 있습니까?

헤더를 포함하는 것이 지연된 방법이므로 빌드 시간이 느려지고 많은 의존성이 발생합니다. 많은 수의 include/import 선언문을 작성할 필요가 없기 때문에 편리합니다. 그러나 프로그램을 사용해야하는 사람들에게는 배려가되지 않습니다.

또한 헤더 파일을 가져 오는 경우 왜 @class 선언을 제공해야합니까?

클래스 인터페이스가 이미 표시되어 있거나 (이미 포함되어 있거나 다른 파일이 선언 한 경우) 둘 다 필요하지 않은 경우 매우 단순한 경우를 제외하고 유형을 사용하려는 경우 인터페이스가 표시되어야합니다.

빌드 시간이 길어지면 실수를 바로 잡을 수 없을 것입니다. 올바른 방법을 사용하여 배우고 구현하는 것이 가장 좋습니다. 복잡한 C 프로젝트를 개발하지 않았다면 컴파일하는 동안 얼마나 많은 시간을 낭비하게 될지 매우 놀랄 것입니다.

귀하의 프로그램이 결코 사소해서 결코 공유되거나 재사용되지 않을 것이라고 생각되면 원하는대로하십시오.

행운을 빈다!

관련 문제