2012-03-05 2 views
1

나는 목표 - C에서 아주 새로운 그리고 난 질문했습니다 :특정 상황에서 Obj-c 범주의 용도.

나는 다음과 같은 몇 가지 애플의 샘플 코드를 통해 왔으며 발견했습니다의 상단에서

https://developer.apple.com/library/ios/#samplecode/GLSprite/Listings/Classes_EAGLView_m.html#//apple_ref/doc/uid/DTS40007325-Classes_EAGLView_m-DontLinkElementID_4

을 파일, Objective-C 범주 사용을 발견했습니다.

@interface EAGLView (EAGLViewPrivate) 

- (BOOL)createFramebuffer; 
- (void)destroyFramebuffer; 

@end 


@interface EAGLView (EAGLViewSprite) 

- (void)setupView; 

@end 

그 직후에 EAGLView 클래스의 구현을 시작합니다.

위의 3 가지 기능을 헤더 파일에서 직접 정의 할 수 있으므로 범주의 실제 목적은 무엇입니까?

들으에는하는 .m 파일에 이러한 방법을 선언 제 카테고리의 이름 ("EAGLViewPrivate")로 표시된 바와 같이

답변

6

전용 방법을 시뮬레이션하는 방법이다. Objective-C는 private 메소드를 지원하지 않지만 .h 파일에서 선언되지 않았기 때문에 컴파일러는 선언 된 .m 파일 외부의 코드가 호출하려고 할 때 경고합니다.

최근 클래스 확장을 사용하면 클래스 확장을 사용하면 클래스의 @implementation 블록에 "private"메서드가 구현되어 있지 않으면 컴파일러 경고가 발생하므로 일반적으로 클래스 확장 (카테고리의 특수한 경우)으로 수행됩니다. . 클래스 확장은 Objective-C 2.0의 새로운 기능이므로 이전 코드에서는 게시 한 코드 에서처럼 이름에 비공개 범주가 자주 표시됩니다. 의도는 같습니다.

+0

명확한 답변은 Thx입니다. 그러나 왜 1이라는 대신 2 개의 다른 카테고리가 필요한지 알고 있습니까? –

+0

코드 의도 작성자가 무엇인지 잘 모르겠습니다. 대부분의 경우 코드를 약간 더 읽기 쉽게하기 위해 함수로 메소드를 구성하는 것입니다. 많은 private 메서드가있는 경우 관련 메서드 그룹을 분리하여 코드를 읽고 리팩터링을 쉽게 할 수 있습니다. 즉, 나는 단지 그것을 사용하기 위해 주석과'#pragma mark '를 사용한다. –

+0

시간 동안 알았어. –

관련 문제