2012-01-12 2 views
6

스탠포드 대학의 iPad 및 iPhone 응용 프로그램 개발 과정 비디오를보고 있습니다. 강사는 동영상에서 UI 개체를 구현 파일로 드래그하여 동작을 만들 수 있다고 말합니다. 그러나이 방법은 헤더 파일에 선언하지 않습니다. 이것은 .m 파일에 메소드를 구현하는 것이 좋지만 .h 파일에 선언하지 않는다는 것을 의미합니까?헤더 파일에 메서드를 선언 할 수 있습니까?

답변

6

당신이

목표 - C :-) "확인"을 정의하는 방법에 따라 달라 동적 방법을 사용합니다 ("private", "public"등) 지정자를 실제로 적용하지 않습니다. 따라서 은 헤더 파일의 모든 메서드를 선언 할 때이 필요하지 않습니다.

당신이 설득하지 않으면 형식 검사의 상당한 양을하기 때문에 컴파일러와 싸우게 될 것입니다. 그렇게하지 않으면 잃을 것입니다.

5

구현의 모든 메소드를 헤더 파일에 선언 할 필요는 없습니다. 그러나 헤더 파일에 없다면 다른 파일에서 리터럴 이름으로 파일을 참조 할 수 없으며 구현 파일에서 해당 파일을 "전달 참조"할 수도 없습니다.

(이것은 일반 C에서 서로 다른 것이 아니라 C++의 클래스의 방법이 다릅니다.)

+0

컴파일러의 동작은 Xcode 4.5에서 다소 변경된 것으로 보입니다. 저는 .h에서 선언하지 않은 많은 메소드를 가지고 있으며 컴파일러 에러가 없습니다. 그러나이 코드를 Xcode 4.2로 가져 가면 iOS 4.3과의 호환성을 확인할 수 있으므로 컴파일러에서 오류가 발생합니다. – JScarry

+0

@JScarry - 컴파일러 플래그의 종류에 따라 다르지만 비슷한 동작이 나타났습니다. 그러나 Xcode 4.5는 .m에서'@ interface '의'()'버전의 사용을 추진하고 있으며 거기에 모든 내부 선언을 고수 할 수 있습니다. –

5

그것은 "OK"특정 상황에서, 헤더 예에서 메소드를 선언하지 않는 것. 예를 들어, ARC를 사용할 경우 컴파일러는 일반적으로 메소드 서명을 알아야 올바른 작업을 수행 할 수 있습니다. 그러나 기본적으로 그것이 의미하는 것은 메서드를 사용하는 곳이라면 호출하는 메서드에 대해 이미 알고 있어야한다는 것입니다.

인터페이스 빌더에 대해 이야기하고 있기 때문에 헤더와 구현 파일의 전체 컨텍스트를 "볼"수 있고 메소드가 존재한다는 것을 알기 때문에 모든 메소드에 대해 알 수 있다는 점에서 약간 다릅니다. 즉 위의 내 용어에서이 메소드는 사용되기 전에 정의되었습니다.

  1. 인터페이스 파일 (.H)의 메소드를 정의 사용 전에 정의에 대해서는

    는 일반적인 접근법 수락하거나한다. 예컨대 :

    에서 MyClass.h

    @interface MyClass : NSObject 
    - (void)someMethod; 
    @end 
    

    MyClass.m

    @implementation MyClass 
    - (void)someMethod { 
        // do something 
    } 
    @end 
    
  2. 하는 클래스 연속 카테고리의 방법을 정의합니다. 예 :

    에서 MyClass.h

    @interface MyClass : NSObject 
    @end 
    

    MyClass.m

    @interface MyClass() 
    - (void)someMethod; 
    @end 
    
    @implementation MyClass 
    - (void)someMethod { 
        // do something 
    } 
    @end 
    
관련 문제