2010-12-01 3 views
3

나는 내 .h 및 .m 파일 모두에서이 작업을 끝내 었으며 이것은 첫 번째 Objective-C 프로그램이므로 약간의 정리를 원한다.objective-c에서 .m 또는 .h의 #import 문은?

+0

[가져 오기 파일을 .h 또는 .m 파일에 넣으시겠습니까?] (http://stackoverflow.com/questions/2770243/do-you-put-import-s-in-h- or-m-files) –

답변

11

인터페이스 정의에 영향을주지 않으면 .m 파일에 넣어야합니다.그냥 클래스를 사용하는 경우

, 앞으로 선언을 사용하면 뭔가를 구현 경우

@class AClass; 

@interface Bob : NSObject { 
    AClass* a; 
} 

를, 다음을 가져옵니다 가지의

#import "SomeProtocol.h" 

@interface Bob : NSObject<SomeProtocol> { 
} 

이러한 종류의 진짜 " 최선의 관행 "이 될 수 있습니다. Objective C의 #import 지시문은 파일을 여러 번 포함하므로 오류가 발생하지 않으므로 기술적으로는이 아니지만 컴파일 시간이 늘어납니다.

4

이 내가 따르는 규칙입니다 :

  1. 당신의 헤더 파일에, 당신은 단지 당신이 포함 된 헤더 파일에 선언 된 클래스에 대한 포인터를 사용해야하는 경우, 그럼 난 그냥에 class 문장을 사용합니다 헤더 파일 (.h) 및 정의 (.m) 파일의 전체 가져 오기.
  2. 포함하고있는 헤더 파일에 대한 전체 정의를 사용해야하는 경우 전체 가져 오기가 헤더 파일로 이동합니다. 예를 들어

, 고려 파일 MyClass.m, MyClass.hMyInclude.h :

예, 시나리오 1 :

// MyClass.h 
@class MyInclude; 

@interface MyClass : NSObject { 
    MyInclude *myIncludeObj; 
} 

// MyClass.m 
#import "MyClass.h" 
#import "MyInclude.h" 

Exaple, 시나리오 # 2 :

// MyClass.h 
#import "MyInclude.h" 
@interface MyClass : NSObject { 
    MyInclude myIncludeObj; // MyInclude could be a plain C structure 
} 

// MyClass.m 
#import "MyClass.h" 
+0

클래스가 아니라 @class이어야합니다. –

0

모범 사례 .m 파일에 #import 문을 넣는 것입니다. 당신은 속성 선언 또는 함수 매개 변수에 대한 헤더 파일 내부의 클래스에 대한 액세스를해야하는 경우, 다음과 같이 앞으로 선언을 사용

@class Cocos2DController; 

@interface HoppersAppDelegate : NSObject <UIApplicationDelegate> { 
Cocos2DController* controller; 
} 

는 앞으로 선언이 시스템을 할 수있는 클래스가 존재하는 것을 알고, 그것이 비록 아직 완전히 정의되지 않았다. 이 패턴을 사용하면 헤더를 간결하게 유지하고 특정 클래스에 대해 필요한 헤더 만 가져 오도록 보장하고 응용 프로그램을 통해 # 가져 오기를 연결하는 것은 아닙니다.

특정 문제가 발생할 수 있습니다. 헤더 파일에 # import 문을 포함하면 두 클래스가 서로의 헤더 파일을 가져 오면 #import 루프가 발생할 위험이 있습니다.

1

#import 지시문은 맹목적으로 파일을 제자리에 복사하는 대신 #include 지시문을 개선 한 것으로, 이미 포함되어 있으면 포함하지 않습니다. 따라서 # 동일한 파일을 여러 번 가져 오는 데 문제가 발생하지 않아야합니다.

가능한 한 범위를 가능한 좁게 유지하는 것이 가장 좋습니다. 따라서 #imports를 구현 파일 (.m)에 넣는 것이 좋습니다. 인터페이스 파일 (.h)에 클래스 정의가 필요한 경우

@class MyClass;

구문을 사용하여 구현 파일에서 관련 헤더를 찾을 수 있음을 컴파일러에 알립니다.

희망이 도움이됩니다.

1

하나의 규칙 만 있습니다. .h 파일에서 선언 한 모든 클래스의 수퍼 클래스와 프로토콜에 대한 .h 파일의 맨 위에서 가져 오기. 이는 .h 파일을 가져 오는 모든 파일에도 수퍼 클래스 및 프로토콜에 대한 선언이 필요하기 때문입니다. 이것은 또한 기본 Xcode 템플릿이 .m 파일이 아니라 .h 파일에 #import <UIKit/UIKit.h> 인 이유이기도합니다.

다른 모든 것들에 대한

(인스턴스 변수와 메소드 매개 변수에 사용되는 예를 들어 유형), 전방 선언을 사용하고하는 .m 파일

에 넣고하는 또 다른 방법을 # import를 넣어 것은 : 는 슈퍼 클래스에 대한 선언을 앞으로 사용하지 않습니다 및 프로토콜.

관련 문제