2013-06-02 7 views
3

MKPolygon 클래스의 카테고리를 만드는 중입니다. 이 클래스에 대한 참조는 here입니다. 필자는 내부 구조의 일부를 처리하기 위해 "public"과 소수의 "private"메소드를 만들고 싶어하는 두 개의 공용 클래스 메소드를 가지고 있습니다. 이 작업을 수행하는 이유는 클래스에서 사용할 수있는 메서드가 클래스 메서드이기 때문에 반환 방법 (MKPolygon *)을 제공함으로써이 메서드를 계속 사용하기를 원하기 때문입니다. 또한 필자가 작성할 많은 작업이있을 것이며 작업을 해체하지 않으면 좋은 코딩 방법에 위배되며 테스트 및 읽기가 어려울 것입니다. 이것은 내가 github에 기여할 때 특히 중요합니다.iOS - 개인 방법으로 카테고리를 생성하는 방법

다음은 XCode에서 새 카테고리를 만들 때 생성 된 내 헤더 및 구현 파일입니다. 내 인터페이스 파일 내 implmentation에서

MKPolygon + MKPolygonStuff.h

#import <MapKit/MapKit.h> 

@interface MKPolygon (MKPolygonStuff){ 

} 
+(MKPolygon *)polygon:(MKPolygon *)poly1 doStuff:(MKPolygon *)poly2 onMap:(MKMapView *)map; 
+(BOOL)polygon:(MKPolygon *)poly1 doesThisThing:(MKPolygon *)poly2; 

@end 

MKPolygon + MKPolygonStuff.m

@interface MKPolygon(){ 


} 

+(void)calculateStuff; 

@end 

@implementation MKPolygon (MKPolygonStuff) 

+(void)calculateStuff{ 



} 
+(MKPolygon *)polygon:(MKPolygon *)poly1 doStuff:(MKPolygon *)poly2 onMap:(MKMapView *)map{ 

    //do stuff and call other class methods to break up tasks 
    //[self calculateStuff]; 

} 

+(BOOL)polygon:(MKPolygon *)poly1 doesThisThing:(MKPolygon *)poly2{ 

    //returns boolean 
    //possibly call other class methods do some internals. 
} 

을 : 지금을 가로 질러 내 요점을 파악하는 방법은 일반적인 만들려고하고있다 괄호 안에 뭔가가 있었지만 다음과 같은 경고가 나왔습니다.

"다음에 카테고리가 중복 정의되었습니다. terface ... "

그래서 나는이 문제와 관련하여 여기서 몇 가지 다른 스레드를 읽은 후 괄호를 비워두기로 결정했습니다. 또한이 작업을 수행하면 필자가 필요로하는 인스턴스 변수를 "공용"으로 만들고 싶지 않을 수도 있습니다.

이제 + (void) calculateStuff 옆의 구현 섹션 아래에 경고가 표시됩니다.

"카테고리는 기본 클래스로 구현 될 방법을 구현 중입니다."

나는이 경고를 원인이 무엇인지 확인하기 위해 그물 주변이 경고를 검색하고이 컴파일러는 당신이 어떤 클래스에 기능 내장 재정의 될 것으로 인식하는 경우이 경고를 얻을 것으로 보인다. 문제는, MKPolygon 클래스에 calculateStuff 메서드가 없다는 것입니다. 그래서이 경고를받는 이유가 확실하지 않습니다. 여기에 제가 잘못하고있는 것이 있습니까? 무엇이든지 일반적으로, 제가하고 싶은 모든 것을 여기에 설정 했습니까? 클래스 메서드에서 인스턴스 메서드를 호출 할 수 없으므로 당연히 개인 메서드도 클래스 메서드 여야합니다.

의견/제안/수정을 부탁드립니다.

답변

1

MKPolygon (MKPolygonStuff) 범주의 구현 블록에서만 사용되는 개인 메서드 인 경우 인터페이스에서 해당 메서드를 선언 할 필요가 없습니다.

"MKPolygon + MKPolygonStuff.m"에서 @interface MKPolygon() ... @end 만 제거하면됩니다.

현재 Xcode/clang 버전에서는 구현 블록 내에서 정의되고 사용되는 메소드를 전달하지 않아도됩니다.

+0

하지만 클래스 메서드 내에서 수행 할 모든 작업을 관리하는 데 "개인"개체가 필요합니다 ... 예를 들어 두 개의 NSMutableArray 개체가 필요할 것입니다. 이 경우 @interface ... @ end 블록을 유지해야합니다. 전반적으로 그 밖의 모든 것들은 확인 된 것처럼 보입니까? 이것은 카테고리로 작업 한 처음입니다. 감사. – cspam

+0

@cspam : 귀하의 질문에 대한 (개인) * 방법 * 카테고리에 대한, 그리고 내 대답에 제안 된 부분을 제거하면 컴파일해야합니다. - 그러나 * 범주에 인스턴스 변수를 추가 할 수 없습니다 !!! * 유일한 해결 방법은 "연관된 객체"를 사용하는 것입니다. 예 : 자세한 내용은 http://stackoverflow.com/questions/13000693/how-to-add-a-variable-to-category-in-objective-c (그러나 사소한 것은 아닙니다). –

+0

흥미 롭습니다. 인터페이스의 괄호 안에 뭔가 넣은 다음 NSMutableArray * poly1과 같은 것을 추가하려고하면 인스턴스 변수를 추가 할 수 없다는 컴파일러 오류가 발생했습니다. 괄호를 비워두면 ... 그런 오류는 발생하지 않습니다. 그러나 물론 배열을 인스턴스화하려고하면 "클래스 메서드에서 액세스되는 인스턴스 변수"라는 컴파일러 오류가 발생합니다. 컴파일러가 여기서 어떻게 작동하는지 흥미 롭습니다. 링크를 가져 주셔서 감사합니다. 그것을 볼 것입니다. 다시 고마워요 – cspam