2010-01-24 5 views
29

Objective-c/Cocoa 및 xCode를 사용하여 Mac OS X 용으로 구축하려는 클라이언트가 서버에 있습니다. < => 내가 가지고있는 앱에 대해 서로 다른 프로젝트를 만들었습니다. 그리고 그들 사이에 클래스를 공유하는 가장 좋은 방법이 궁금합니다. 두 가지 모두에 도움이되는 여러 가지 수업이 있습니다. 지금까지 나는 그것들을 복사하고 있었지만, 이것이 최선의 해결책이 아니라고 생각합니다.xcode/objective-c의 프로젝트간에 클래스 공유하기

클래스를 효과적으로 공유하려면 어떻게해야합니까? 하나의 프로젝트로 다시 실행하고 두 개의 빌드 타겟 만 있어야합니까? 어떻게해야합니까?

기타 정보가 필요하십니까?

감사합니다.

답변

12

일련의 제품과 같이 많은 양의 공통 코드를 공유하려는 제품이있는 경우 단일 xcode 프로젝트를 만든 다음 각 제품에 다른 대상을 추가하는 것이 좋습니다. 이는 공유 및 제품 별 코드로 작성됩니다. 공유 코드가 많을수록 클라이언트/서버 쌍의 제품이 이런 식의 훌륭한 후보자가 될 수 있습니다.

기본적으로 xcode 프로젝트에서 빌드하려는 각 대상에 대해 소스 파일, 아트, xib 등 빌드 할 파일을 지정해야합니다. 이렇게하면 파일 A, B, C, D, E, F 및 파일 A, F, X, Y, Z를 사용하여 빌드 할 서버 제품을 사용하여 빌드 할 클라이언트 제품을 설정할 수 있습니다.

xcode 프로젝트를 뛰어 넘을 필요가 없기 때문에 모든 관련 제품을 단일 "xcode"프로젝트 "지붕"아래에서 살고있는 것을 정말 좋아합니다. 공유 파일에 대한 SCM 관리를 실제로 단순화합니다. https://developer.apple.com/library/mac/#featuredarticles/XcodeConcepts/Concept-Targets.html

업데이트 :

다음이 애플의 문서에 대한 링크의 IT는 (항상 뭔가 바로 ... 엑스 코드에서 대상별 헤더 파일 구성에 관해서는 관련 추가 번거 로움 조금있다가?!); 예를 들어,이 대상에 대해 "myHeaderA.h"를 사용하고 해당 대상에 대해 "myHeaderB.h"를 사용하십시오. 이를 수행하는 방법을 공유하는 훌륭한 게시물이 있습니다 : controlling which project header file Xcode will include. 주의 : 이런 식으로 설정 한 후에 xcode는 더 이상 대상 헤더 파일을 검색 할 경로를 알지 않으므로 수동으로 설정해야합니다. 이렇게하려면 대상에서 정보 입수를 마우스 오른쪽 단추로 클릭하고 빌드 범주를 선택한 다음 "헤더 검색 경로"설정을 통해 경로를 추가하십시오. 경로는 입력 한 순서대로 검색됩니다.

+0

이제 새 작업 영역으로이 작업을 수행 할 수 있습니까? –

+1

예 - 이제 Xcode 4.3.2를 실행 중이며 변경할 필요가 없습니다. –

4

가장 좋은 방법은 공유 클래스를 포함하는 별도의 프레임 워크를 만드는 것입니다. 한 번 컴파일하여 두 응용 프로그램 프로젝트에 모두 연결할 수 있습니다.

Apple's doc on what are Frameworks을 참조하십시오.

+2

내 경험에 따르면 프레임 워크는 실제로 잠겨있는 코드에만 적합합니다. 어디에서 변경 사항을 기대하지 않습니다. (실제로 상황은 변하지 않습니다.) 상황은 항상 변합니다. 프레임 워크는 좋은 편인데, 프레임 워크가 방해가되는 경향이 있습니다. 빠른 개발과 혁신을 방해합니다 (프레임 워크를 변경하고 싶지 않기 때문에 다른 앱에서 무언가를 깨뜨린다면) 일년에 한 번 라이브러리 (예 : Apple)를 업데이트하지 않는 한 일반적으로 코드 공유에 좋지 않은 선택입니다. – Womble

+1

@Womble 글쎄, 다른 앱에서 무언가를 깨뜨릴 수있는 것을 변경하지 마라.자신이 원한다면, 오래된 메소드를 deprecated로 표시하고 새 메소드를 작성하십시오 ... –

2

가장 빠른 해결책은 .h 및 .m 파일의 참조 만 프로젝트 중 하나에 추가하는 것입니다. xcode에서 "기존 파일 추가"-dialog의 "copy"-checkbox를 선택 취소하십시오. 프로젝트를 이동/공유하는 경우 참조 된 파일을 복사해야 할 수도 있습니다.

+1

소스 컨트롤을 사용하면 좋을까요? 나는 프레임 워크 솔루션이 CVS와 친구들과 더 자연스럽게 작동 할 것이라고 생각한다. – Spina

1

나는이 주제에 대한 좋은 기사를 여기에서 발견했다 : http://www.clintharris.net/2009/iphone-app-shared-libraries/ 이것은 여러 아이폰 앱 공유 코드에 관한 나의 질문에 대한 대답이다. 프레임 워크 (위)에 대해서는 언급하지 않았으므로 제안 (xcode 프로젝트 참조)이 프레임 워크 솔루션에 비해 유리한지 말할 수는 없습니다.

+0

iPhone의 파일 시스템 및 공유 라이브러리 제한 사항과 상황이 매우 다릅니다. –

11

공유 코드를 SCM 시스템에 넣고 원하는 각 프로젝트에 포함시키는 것이 가장 좋습니다. 모든 프로젝트에서 코드를 공유 할 수 있으므로 어디서나 편집하고 변경 사항을 확인할 수 있습니다. 당신이 그것에 대해 기분이 좋을 때 소스 컨트롤로 돌아 간다 - 그리고 다른 모든 프로젝트는 당신의 작업에서 이익을 얻는다.

이 IMO 그 일을하는 다른 방법을 통해 큰 장점이 있습니다

대가 프레임 워크 : 프레임 워크에 포장 코드가 꽤 성가신이며, 프레임 워크 민간 번들로드하는데 장시간이 소요될 - 특히 단지 앱에 몇 가지 클래스를 추가 할 수 있습니다. Omni Group의 Wil Shipley (당시)는 한때 모든 회사의 응용 프로그램에 포함 된 프레임 워크가 각 응용 프로그램의 시작 시간에 몇 초를 더하는 것을 발견했습니다. 프레임 워크에서 개인 클래스를 패키징하는 것은 엄격하게 필요한 것보다 더 많은 연결을 장려 할 수 있습니다. 모든 공유 클래스가 상주하는 하나의 진정한 프레임 워크를 만드는 것이 유감이므로이 코드가 항상 함께 살아 있다고 가정합니다. 그것은 분리 할 수 ​​없게된다. 기본적으로 프레임 워크는 망치이고이 문제는 나사입니다.

대 그냥 파일을 포함 : 어쨌든 어떤 시점에서 앱을 SCM에 넣고 SCM에없는 파일을 포함 시키면 문제가 발생하기를 바랍니다. 파일을 각 프로젝트에 복사하면 반대되는 문제가 발생합니다. 각 프로젝트에는 자체 버전의 파일이 포함되므로 유용한 변경 사항을 수동으로 전파해야합니다.

+2

안녕하세요 척,이 접근법을 고려하고 있지만 "원하는 각 프로젝트에 포함시키는 것"이 ​​실제로 수반되는 것은 확실하지 않습니다. Xcode에서 또는 뭔가 SVN 외부 속성과 같은 일을하는 것에 대해 이야기하고 있습니까? 정확히 무슨 뜻이야? 감사. – Cal

+1

척 (Chuck)의 답변 주셔서 감사합니다. 이것은 내게로가는 길과 같습니다. 그러나, 나는이 주제에 대해 꽤 신인이다. 좀 더 자세한 설명이나 예를 든 소스가 있습니까? – Tom

+0

@chuck 혹시 자습서를 보았거나 제안한 내용을 적어 두었습니까? –

2

나는 비슷한 문제가있어 위의 대답으로 인해 초보자에게 문제가 발생할 수 있습니다.

두 프로젝트가 일부 프로토콜로 통신하는 경우 괜찮습니다. TCP/IP 또는 통신하지 않는 경우. 하나의 프로젝트가 애플리케이션과 동일한 클래스에 액세스해야하는 번들 (예 : 플러그인) 인 경우 (동일한 프로세스에서 실행되는 동안) 동일한 이름의 클래스를 갖는 것에 대한 링크 또는 런타임 경고/오류와 관련된 문제가 발생합니다. 이 문제를 해결하는 가장 간단한 방법은 프레임 워크를 사용하는 것입니다. 프레임 워크를 사용하면 세 개의 모든 대상이 같은 프로젝트에 있으므로 프레임 워크를 별도로 설정하거나 프레임 워크를 별도의 프로젝트에 포함 할 수도 있습니다. ,

  1. 이 프레임 워크를 만들기를 통해 모든 공유 코드를 복사 :

    내가 응용 프로그램과 번들 플러그인 프로젝트를 가지고, 여기에 내가 엑스 코드 (6)에서 다음 단계입니다.
  2. 프레임 워크의 기본 헤더에 모든 공유 코드의 헤더를 포함하십시오.
  3. 빌드를 테스트 할 프레임 워크 빌드 (예 : 프레임 워크 구성을 선택하고 재생을 클릭하십시오)
  4. 애플리케이션 및 플러그인 번들의 빌드 단계 섹션으로 이동하여 '타겟 종속성'및 '와 링크 바이너리 라이브러리'
  5. 그냥 메인 헤더를 사용하고 <를 사용하여 응용 프로그램과 번들 코드에서 프레임 워크 물건을 포함> 오히려 프레임 워크 푸
# import를 사용하여 호출 된 경우 예를 들어, ""이상

기본 앱을 실행할 때 프레임 워크의 변경 사항이 자동으로 컴파일되므로 사실상 fac을 무시할 수 있습니다 그들은 서로 다른 목표입니다.

관련 문제