문제

코코아 응용 프로그램을 만들고 다양한 코드 생성을 위해 Xcode를 사용하고 있습니다.Subclassing UIView를위한 .h 및 .m 파일을 생성하기 위해 잘 작동하지만, UIViewController 서브 클래스가있는 경우 .m 파일에서 @interface가 끝나는 것입니다.

//in MyViewController.h
@interface MyViewController : NSViewController <MyViewDelegate>

@end
.

뿐만 아니라

//in MyViewController.m
@interface MyViewController ()

@end

@implementation MyViewController

@end
.

아직 잘 컴파일합니다.그래서, 이것이 정상적인 행동이라고 가정하면 질문의 두 부분은 다음과 같습니다. (a) 왜 이것이 어떻게 일어 났는가? (b) 특히 컴파일 주문의 측면에서 결과는 무엇입니까?

감사합니다!

도움이 되었습니까?

해결책

i Subclass UIViewController가있는 경우 .m 파일에서 @Interface 선언을 두 파일에서 동일하게 얻을 수 있습니다 ()

눈치 채므로 두 인터페이스 블록이 not 이 아닙니다. ()가 중요합니다.()를 가진 것은 이름이없는 카테고리와 유사한 클래스 확장 입니다.카테고리와 클래스 확장 사이의 두 가지 중요한 차이점은 다음과 같습니다.

  1. 클래스 확장명에서 인스턴스 변수를 선언 할 수 있지만 카테고리에서는 할 수 없습니다.

  2. 클래스 확장은 구현 블록과 동일한 파일에 나타나야합니다.

  3. 클래스 확장은 구현과 관련된 메소드 또는 변수와 같은 헤더 파일에 노출되지 않고 클래스의 사용자가 의존해서는 안됩니다.

다른 팁

카테고리에 익숙해지고 있습니까?당신이 관찰하는 것은 유사하지만 범주의 중요한 구분이 있습니다.여기의 구별은 익명으로 (따라서 빈 팬란)이며 원래의 클래스가 컴파일되는 동시에 컴파일된다는 것입니다.그 늦은 부분은 중요한 부분입니다. 인스턴스 속성 (저장소)을 추가 할 수 있음을 의미합니다.이는 "내부 전용"또는 "비공개"메소드 및 속성을 선언하는 데 가장 일반적으로 사용됩니다.그러나 런타임에 '개인'집행의 개념이 없으므로 게시되지 않은 인터페이스에 관한 모든 인터페이스에 관한 것입니다.이것은 핵심 클래스의 구현 파일을 작성하는 사람들에게 '게시'된 인터페이스가 매우 명확하게 정의 된 인터페이스 일뿐입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top