2015-01-13 3 views
2

프로그래밍 할 상황에 따라 실제로 클래스를 편집하지 않고 클래스의 일부 메서드를 구현해야하므로 범주를 사용하고 있습니다.주요 클래스의 private 메서드에 액세스하는 범주 - 목표 C

클래스의 인터페이스에는 포함되지 않은 메소드가 있지만 클래스 구현에서 구현됩니다. 나는 이것이 단지 개인적인 방법이라는 것을 가정하고 있습니다.

카테고리가 기본 클래스의 개인 메소드에 액세스 할 수 있습니까? 이 아니기 때문에

이 이해할 수있다 " 'MainClass'에 대한 눈에 띄는 @ 인터페이스가 선택 'privateMethod'를 선언하지"나는 내 카테고리의 민간 방법 중 하나를 사용하려고하면 나는 오류 인터페이스에서,하지만 논리적으로 구현의 모든 것을 액세스 할 수있을 것이라고 생각했다.

답변

4

호출하려는 메소드를 어딘가에 선언해야합니다. 당신은 당신의 자신의 범주 사용하여 직접 선언 할 수

가 제거됩니다
@interface MainClass(MyPrivateMethods) 
- (CGRect)privateMethod:(NSString*)someParameter; 
@end 

컴파일러 경고 " 'MainClass'에 대한 가시적 @ 인터페이스가 선택 선언"을, 당신은 그냥 런타임에서 작동 희망해야 . MainClass에 해당 매개 변수 및 반환 유형과 함께 해당 이름의 메서드가 없으면 런타임에 오류가 발생합니다.

(performSelector:을 사용할 수도 있지만 컴파일러 설정에 따라 인식 할 수없는 선택기에 대한 경고가 표시 될 수 있으며 모든 매개 변수 및 반환 유형에서 작동하지 않습니다.

2

표준 처리 방법이 있습니다.

@interface MainClass() 
- (void)privateMethod; 
@end 

1 .m 파일의 메소드에만 액세스해야하는 경우 선언을 해당 파일의 맨 위에 놓습니다. 두 개 이상의 .m 파일에서 액세스해야하는 경우 MainClassSubclass.h 헤더를 만들어 이러한 메서드를 저장합니다. 이 패턴의 예를 들어

, 당신은 protected method에 개인 방법을 전환하고, 실제로 UIGestureRecognizer


UIGestureRecognizerSubclass.h 봐.