2011-11-19 2 views
2

일부 사람들이 .m 파일에서 메소드를 선언하는 이유를 이해하지 못합니다. 그 선언은 .h 파일에 대신 들어갈 수 없습니까? 여기에 내가 주로 볼 수있는 작업은 다음과 같습니다.h 파일과 .m 파일에서 @interface 및 @end를 지정하는 메소드의 차이점

//myClass.h 

#import <UIKit/UIKit.h> 

@interface myClass: UIViewController 
{ 

} 

@end 

및 구현 (하는 .m) 부분 :

//myClass.m 

#import "myClass.h" 

@interface myClass 

//declare some methods here 

@end 

@implementation myClass 

//the actual implementation 

@end 

방법이 방법을 선언 어떤 차이가 있습니까? 또한 "@private"메서드는 myClass.h 자체에서 선언 할 수 있습니까?

+0

가능한 중복 [.h와 .m 파일의 @interface 정의 간의 차이] (http://stackoverflow.com/questions/3967187/difference-between-interface-definition-in-h-and-m-file)) –

답변

4

게시 한 코드는 컴파일되지 않으며 헤더의 메소드 선언과 동일하지 않습니다.

헤더의 목적은 다른 클래스가 가져올 수있는 선언 세트를 제공하는 것입니다. 구현 파일을 가져올 수 없습니다. 중복 정의가 만들어지기 때문입니다.

bbum이 말했듯이 구현 파일에이라는 private 메소드 선언이 표시됩니다. 이것들은 클래스 외부에서 사용되지 않기 때문에 구현 파일에서 선언됩니다. 이 기능은 클래스 확장이라고합니다 :

//MyClass.h 

#import <UIKit/UIKit.h> 

@interface MyClass: UIViewController 

// Declare methods that other classes should call here 

@end 

//MyClass.m 

#import "MyClass.h" 

@interface MyClass() // <--- NOTE THE PARENTHESES HERE 

// Declare methods that only this class should be using here 

@end 

@implementation MyClass 

// Define all your methods here 

@end 

을 그리고 아니, 당신은 다른 곳에서는 헤더에 "@private 방법"을 선언하거나 수 없습니다. Objective-C에는 그런 것이 없습니다. @private 액세스 지정자는 변수에만 적용됩니다.

+0

확인. 그걸 명확히 해 주셔서 감사합니다 ... – Balaram

+0

Excellent answer .. !! –

2
  • MyClass 아니요, myClass; 클래스는 대문자로 시작합니다.

코드가 전혀 컴파일되지 않으면 놀랄 것입니다. .m에 있으면 다음과 같이 말하면됩니다.

@interface MyClass() 
@end 

그런 다음에 여러 번 논의 된 클래스 확장입니다. 그렇다면 MyClass에 대해 @interface이라는 충돌을 선언하고 컴파일러에서 불평해야합니다.

+0

글쎄, 클래스는 모자로 시작하지 않아도됩니다. 이것은 표준 규칙 (준수해야 함)이지만 컴파일러 나 다른 Xcode/iOS 구성 요소에서는 적용되지 않습니다. –

+2

대문자로 클래스를 시작하지 않고 해당 코드를 코딩 샘플로 제출하면 괜찮은 회사에 대해서만 해당 코드가 고용 될 가능성이 큽니다. 너의 선택. ;) – bbum

5

공용 클래스와 개인 인터페이스 간의 분리를 유지하는 것입니다.

구현 파일에서 메서드, 속성 및 iVars를 선언 할 수 있다는 것은 클래스에서 수행하고 사용할 수있는 작업과 클래스 외부에서 수행 할 수있는 작업을 명확하게 나타내는 지표입니다.

속성을 다시 선언 할 수도 있습니다. 예를 들어 :

.H

@property (readonly, copy) NSString *aString; 
에서하는 .m에서

클래스 내에서 너무
@property (readwrite, copy) NSString *aString; 

당신은 READWRITE로 속성을 처리 할 수 ​​있지만, 외부의 속성입니다 읽기 전용.

0

.m 파일에서 여러 번 내부 클래스 (메인 클래스와 다른 이름)가 선언되었습니다.이것들은 .m이 포함하고 (그리고 .h에서 선언 된) 메인 클래스에 의해 사용되는 클래스들이다. 이 방법은 내부 클래스가 "private"이며, 하나의 파일에이 클래스를 모두 포함하고 있기 때문에 기본 클래스 구현에서 작업하는 동안 읽고 업데이트하는 것이 더 쉽습니다.

+0

제안; 내부 클래스를 선언 할 때 클래스 이름에'__'과 같은 접미사를 추가하십시오. 이것은 내부 클래스가 역 추적 (backtrace)에 관련되어있을 때 완전히 명백하게 만든다. 내부 클래스를 항상 사용한다 - 매우 유용하며 - 일반적으로 구조 대신 클래스를 사용한다. – bbum

관련 문제