2014-10-09 2 views
0

내 프로젝트에는 iOS XCode 프로젝트에 목업자 정보를 제공하여 앱 스토어의 스크린 샷을 만드는 데 도움이되는 목표 C 클래스 MockupModel이 있습니다.Xcode의 약한 링크 된 클래스

프로젝트에는 두 가지 목표가 있습니다. 모형 타겟에는 MockupModel.m이 포함됩니다.

이 아닌MockupModel.m이 포함되도록 기본 대상 (실제 앱의 경우)이 실수로 배송 응용 프로그램에 링크 될 가능성이 없도록하고 싶습니다.

그러나 파일의 속성 검사기를 사용하여 프로젝트에서 MockupModel.m을 제외하면 프로젝트가 연결되지 않습니다. MockupModel의 기능이 누락되었습니다라는 오류 메시지가 나타납니다.

MockupModel을 선택적으로 선언 할 수있는 방법이있어서 링커가 구현되지 않았다고 걱정하지 않습니까? 런타임에 내 코드가 NSClassFromString(@"MockupModel") 또는 [MockupModel class]으로 사용 가능한지 확인합니다.

감사합니다.

+0

내가 찾고 수 있습니다 같은데을 '__attribute ((weak_link)) __'또는'WEAK_LINK_ATTRIBUTE'을 사용하지만 클래스에 선언하는 방법을 모르거나 클래스를 하나만 사용할 수 있다고하더라도? 그것은 도서관 것 같다? – Benjohn

답변

1

주 목표가 아닌 대상에 사용자 정의 전 처리기 지시문을 추가하십시오. USE_MOCKUP_MODEL이라고 부를 수 있습니다. 주 대상의 파일 목록에서 MockupModel.h 및 MockupModel.m를 제거하고 MockupModel을 참조하는 모든 소스 (또는 수입)와 서라운드 :

#ifdef USE_MOCKUP_MODEL 
//source 
#endif 

예 :

#ifdef USE_MOCKUP_MODEL 
#import "MockupModel.h" 
#endif 

Model *myModel = nil; 
#ifdef USE_MOCKUP_MODEL 
myModel = [MockupModel new]; 
#else 
myModel = [RealModel new]; 
#endif 
+0

안녕하세요 이안, 감사합니다. 나는 이런 식으로 전 처리기 솔루션을 사용했다. 링커 (링커에 대해 조금 배우기 만하면)를 사용하여 영리한 작업을하는 것을 선호한다고 생각합니다.하지만이 작업이 완료됩니다! 나는 당신의 대답을 표결하겠습니다 만, 누군가가 링커 기반의 솔루션을 제공 할 수 있다는 희망으로 질문을 공개적으로 남겨 둘 것입니다. – Benjohn

+0

나는 그것이 의미가 있는지 모르겠습니다. 코드를 컴파일 한 후 링크가 발생합니다. 컴파일은 링크가 완료된 후 존재할 것으로 예상되는 기호를 참조합니다. 알 수없는 기호를 제거하기 위해 링커에서 따라갈 수있는 작업 집합이 없으므로 항상 오류를 선택합니다. 링크가 예정되지 않은 심볼을 참조하는 소스는 사전 처리 단계에서 사전 컴파일로 제거해야합니다. –

+0

if ([XXNewFeatureClass class]! = nil) {[XXNewFeatureClass doSomething];} else {// 대체 옵션.}'[here] (http : //)를 참조하여 iOS의 기능을 사용할 수 있는지 테스트 할 수 있습니다. /stackoverflow.com/a/10068079/2547229)을 참조하십시오. 선언 된 기호가 실제로 사용되지 않는다면 (충돌에 대한 책임은 나의 것입니다), 링크 여부는 코드 파일의 존재 여부에 달려 있습니다. 나는 모델을 별도의 라이브러리에 넣으면 이것이 가능할 것이라고 확신하지만, 그렇게 할 필요가 없다 :-) - 아마도 배워야한다! – Benjohn

관련 문제