2013-09-03 2 views
5

나는 클래스의 인터페이스를 정의하는 헤더 파일이 있습니다Xcode에서 타겟 당 여러 개의 구현이 가능합니까?

// MyClass.h - included in all targets 
// 
@interface MyClass 
+ (void) doThing; 
@end 

을 그리고 난 두 개의 서로 다른 실행 파일이 - 대상에 하나씩.

// MyClass+targetA.m - Only included in targetA 
// 
@implementation MyClass 
+ (void) doThing { NSLog(@"targetA"); } 
@end 


// MyClass+targetB.m - Only included in targetB 
// 
@implementation MyClass 
+ (void) doThing { NSLog(@"targetB"); } 
@end 
  • 이 방법에 문제가 있습니까?
  • 각 대상의 동작을 사용자 지정하는 더 좋고 간단한 방법이 있습니까?

방법 MyClass는 앱의 모양을 테마로합니다. MyClass 및 여러 대상에 대한 몇 가지 방법이 있습니다.

+2

두 가지 구현이 너무 다른데 서로 다른 소스 파일에 존재한다고 정당화됩니까? 그렇지 않은 경우 타겟 전용 전 처리기 정의를 기반으로 한 #ifdef가 더 나은 선택 일 수 있습니다. 두 파일을 유지하기로 결정했다면 이름을 바꾸는 것이 좋습니다. 두 파일의 이름이 같을 때 Xcode가 혼란스러워지는 것을 보았습니다. (괜찮 았지만 편집기에서 잘못 표시했습니다.) – mah

+0

@ 마 - 재미 있습니다! 귀하의 회신에 감사드립니다. 전 선행 처리기 정의를 사용했지만, 과거에 사용했기 때문에 정의했습니다. 구현은 다른 클라이언트에 대한 응용 프로그램을 테마로하기 때문에 구현 사이에는 약간의 차이가 있습니다. 이름 변경에 대한 좋은 팁 - 나는 그렇게 할 수는 없지만 그렇게하지 못했습니다. – Robert

+0

클래스 이름과 소스 파일 이름 사이에는 아무런 연관이 없으므로 분명히 가능합니다. 물론 MyClass_client1.m, MyClass_client2.m 등과 같은 방식으로 이름을 지정하는 것이 가장 좋습니다. – mah

답변

1

예, 조건부 컴파일을 사용한다는 점을 제외하고는 비슷한 접근 방식을 취했습니다. 하나의 대상이 개인 기능을 노출하고 다른 대상이 공용 기능을 노출하고, 모든 타겟은 동일한 소스 파일 세트를 공유합니다.

그러나 두 가지 방법 모두의 결과는 같습니다.

+0

답변 해 주셔서 감사합니다 ! 필자는 "개인 기능을 노출하는 대상과 공용 기능을 노출하는 또 다른 대상"이 무엇을 의미하는지 이해하지 못합니다. 흥미로운 소리 네요, 조금 설명해 주시겠습니까? – Robert

+0

@Robert 제한된 기능으로 일반인에게 정적 라이브러리를 제공하기를 원하기 때문에 컴파일하는 동안 상수를 사용하여 개인 및 공개 빌드를 제어합니다. – trojanfoe

1

그래서 실제로 OTHER_CFLAGS을 내 설정 플래그 (TARGET_FREE) 중 하나에 대한 대상 설정으로 선호합니다. 그리고 나서 소스 코드에서 다음과 같이 쓸 수 있습니다 :

@implementation MyClass 
+ (void) doThing { 

#ifdef TARGET_FREE 
    // Code for one target 
#else 
    // Code for another 
#endif 

} 
@end 
+0

예 과거에는 이것을 사용 했었지만 제대로 작동합니다. 문제는 'MyClass'의 복잡성입니다. 그것에는 약 20 가지 방법이 있습니다 (Themeing for 다른 클라이언트의 템플릿 응용 프로그램). 이 방법으로 구현하면 대상 및 메서드 수가 늘어남에 따라 코드가 복잡해집니다. – Robert

+0

확인. 내가 참조. 그러니, 그것이 컴파일되어 작동해야만하기 때문에. 관련 코드를 편집 할 때 xcode에서 탐색 또는 코드 감지 문제가 발생할 수 있지만 확실하지 않을 수 있습니다. – Skie

+0

예, 헤더에서 소스로의 바로 가기 탐색이 깨졌습니다. 나는 trojanfoe의 조언을 받아 각 .m 파일의 이름을 변경했다. 나는 그걸로 살아갈 수 있다고 생각한다 – Robert

관련 문제