2012-11-29 4 views
1

.m의 .h 및 #import "ClassA.h"에 전달 클래스 선언 (@class ClassA)을 두는 것이 올바른 방법이라는 것을 알고 있습니다. 또한 컴파일러가 나중에 컴파일 할 수 있다는 것을 알고 있습니다. (.m을 가져 오기 전까지).@ 클래스에 대한 forward class 선언

보통 우리는 오전에 컴파일해야 컴파일러는 여전히 A.h에를 ClassA를 컴파일 컴파일러하지 않을지라도 한편, A.m에서 ClassA.h # import를 추가 A.h에를 ClassA @class 사용 왜 A.h에서 #import를 직접 사용하지 않으시겠습니까?

+0

http://stackoverflow.com/questions/9177265/why-use-forward-declaration-rather-than-import-in-h-file?rq=1 – ohho

답변

2

A.h에서 거의 @Class A을 사용하지 마십시오. 일반적인 연습은 A.h에서 @Class B을 사용하고 B.h.에서 @Class A을 사용하는 것입니다. 그 이유는 .h 파일의 순환 종속성을 피하기 위해서입니다. A.h가 B.h를 가져오고 B.h가 A.h를 가져온 경우 컴파일러는 순환 종속성에서 폭발합니다.

마지막 문장은 왜 우리가 A.h를 가져 오지 않는지 묻는 것 같습니다. 나는 이것이 왜 끝나지 않는지 꽤 분명하다고 생각합니다.

헤더 파일 (.h)은 선언에 대해 가능한 한 최소한을 세계에 알리기위한 것임을 기억하십시오. 컴파일러에게 "이봐, 우리는 몇 가지 메소드와 속성을 가진 클래스 (@interface)를 가지고있다. 그리고 그 메소드는 다른 클래스를 사용한다. 우리는이 다른 클래스에 @class를 사용한다. 궁극적으로, 링커는 클래스가 실제로 어딘가에 존재하는지에 대한 최종 결정을 내린다.

소스 파일 (.m) 컴파일러에서 실제로 사용하려는 메서드 및 속성이 있는지 확인해야하기 때문에 실제 가져 오기를 수행해야하지만 헤더 파일은 메서드를 호출하지 않고 속성을 호출하지 않습니다. 단순히 "This 물건이 있습니다. "

0

나는 # import 대신 @class를 사용합니다. 두 가지 이유 :

  1. 순환 의존성을 가능하게합니다.

  2. 컴파일 시간이 줄어 듭니다.

전방 선언 없이는 불가능한 상호 링크 A-> B 및 B-> A가있는 것이 일반적으로 유용합니다.

관련 문제