Xcode 6에서 ProjectName-Prefix.pch가 자동으로 생성되지 않는 이유는 무엇입니까?


264

ProjectName-Prefix.pch에서 자동으로 생성 되지 않는 이유는 무엇 Xcode 6입니까?

프리 컴파일 헤더가 더 이상 필요하지 않습니까?

ProjectName-Prefix.pch이전에 있던 코드를 어디에 작성해야 합니까?

답변:


136

모듈 때문에의 필요성을 제거하는 것으로 의심 #import <Cocoa/Cocoa.h>됩니다.

접두사 헤더에 넣을 코드를 어디에 두어야하는지 접두사 헤더에 넣을 코드가 없습니다. 가져 오기를 필요한 파일에 넣습니다. 정의를 자체 파일에 넣으십시오. 당신의 매크로를 어디에도 두지 마십시오. 다른 방법이 없으면 (예 : 필요할 때 __FILE__) 매크로 작성을 중지하십시오 . 매크로가 필요한 경우 헤더에 넣고 포함하십시오.

접두사 헤더는 전체 시스템의 거의 모든 것 (예 :)에 거대하고 사용되는 것들에 필요했습니다 Foundation.h. 거대하고 어디에나있는 것이 있다면 아키텍처를 다시 생각해야합니다. 접두사 헤더는 코드 재사용을 어렵게 만들고 나열된 파일 중 하나라도 변경 될 수 있으면 미묘한 빌드 문제를 일으 킵니다. 당신이 보여줄 수있는 심각한 빌드 타임 문제가 접두사 헤더로 크게 향상 될 때까지 그것들을 피하십시오.

이 경우 하나를 만들어 clang에 전달할 수 있지만 좋은 아이디어는 거의 없습니다.


편집 : 모든 뷰 컨트롤러에서 사용하는 HUD에 대한 특정 질문에, 실제로 그것을 사용하는 모든 뷰 컨트롤러로 가져와야합니다. 이것은 의존성을 명확하게합니다. 새 프로젝트에서 뷰 컨트롤러를 재사용하면 (컨트롤러를 잘 구축 할 경우 일반적 임) 즉시 필요한 것을 알 수 있습니다. 이것은 카테고리에 특히 중요합니다. 암시 적 코드를 재사용하기가 매우 어려울 수 있습니다.

PCH 파일은 목록 종속성을 제거하지 않습니다. 당신은 여전히 가져와야 UIKit.h또는 Foundation.h필요에 따라 엑스 코드 템플릿처럼. PCH의 이유는 (UIKit과 같이) 정말로 방대한 헤더를 다룰 때 빌드 시간을 향상시키기 위해서입니다.


102
@ 당신의 대답은 주관적인 분노입니다. 이 질문에 대한 답변으로 받아 들여야한다는 데 동의하지 않습니다. pch없이 어떻게 github.com/seancook/TWReverseAuthExample/blob/… 같은 것을 구현 하시겠습니까? 각 파일마다 로그를 가져 오시겠습니까? 이것은 코드에 불필요한 팽창의 전체 더미를 만듭니다.
Maxim Veksler

26
실제로 해당 매크로를 사용하는 각 파일은 그렇습니다 (제 경험상 이것은 일반적으로 시스템의 모든 파일보다 적습니다). 이것은 내 요점의 아주 좋은 예입니다. 가져 오기는이 로깅 매크로에 대한 종속성이 있다는 사실을 암시 적으로 숨 깁니다. TWAPIManager.m예를 들어 다른 프로젝트 에을 복사하려고하면 TWALog()찾을 수없는 위치에 대한 힌트없이 정의되지 않은 오류가 발생 합니다. 코드를 공유하려는 여러 대형 프로젝트에서 정확히 그 문제가 발생했습니다. TWAPILog.h그것을 생성 하고 임포트하면 사소한 개발 비용 으로이 문제를 해결할 수 있습니다.
Rob Napier

5
난 안 ... P 채널 파일을 사용, 그것은 나에게 미친 것 거의 모든 클래스에서 ReactiveCocoa를 사용
스테파노 Mondino

2
모듈뿐만 아니라 신속한 지원은 아마도 큰 부분 일 것입니다.
uchuugaka

12
핵심은 PCH가 사전 컴파일 된 헤더라는 것 입니다. 사전 컴파일은 자동 가용성이 아닌 빌드 성능을위한 것입니다. 사전 컴파일은 빌드를 망칠 몇 가지 방법을 소개하며, 깨끗하지 않은 빌드 (예 : Foundation) 사이에서 절대 바뀌지 않는 거대한 것들을 위해 예약해야합니다 .
Rob Napier

425

적절한 지 여부에 대한 질문없이 PCH 파일을 수동으로 추가 할 수 있습니다.

  1. 새 PCH 파일을 프로젝트에 추가하십시오 (새 파일> 기타> PCH 파일) .

  2. 대상의 빌드 설정 옵션에서 접두사 헤더 의 값을 프로젝트 이름을 접두어로 사용하여 PCH 파일 이름으로 설정하십시오 (예 : 프로젝트 이름 TestProject및 PCH 파일 이름 은 plist에 MyPrefixHeaderFile값 추가 TestProject/MyPrefixHeaderFile.pch).

    팁 : 프로젝트에 넣는 경로 와 같은 경로를 사용 $(SRCROOT)하거나 $(PROJECT_DIR)경로에 도달 할 수 있습니다 .pch.

  3. 대상의에서 빌드 설정 옵션의 값으로 설정 프리 D 접두사 헤더를 합니다 YES.


32
PCH 파일에 대한 나의 의견에도 불구하고 +1. 사람들이 도구를 사용하는 방법을 아는 것이 여전히 유용합니다.
롭 네이피어

20
@Yedidya, 나는 당신이 그것에 대한 판단에 관계없이 질문에 대한 답변을하기 위해 시간을내어 주셔서 감사합니다. 사람들이 질문에 대한 조언이 얼마나 나쁜지에 대해 사람들을 속이기보다는 정중하게 질문에 대답하는 데 시간이 걸리면 감사합니다.
campo

3
감사. Objective-C를 Swift 프로젝트에 통합 할 때 유용하므로 다시 돌아가서 포함 파일을 각 .m 파일에 추가 할 필요가 없습니다.
Chris Prince

ObjC에서 Swift로 전환 할 때 매우 편리합니다. ObjC로 작성된 라이브러리가 있으며 마지막으로해야 할 일은 올바른 시스템 헤더를 포함하도록 모든 라이브러리를 편집하는 것입니다.
Echelon

1
타겟의 빌드 설정을 사용했기 때문에 이것은 효과가 없었습니다. 그러나이 지침을 따르면 프로젝트 빌드 설정을 수정하는 대신 모든 것이 작동했습니다.
Pauls

128

당신은 자신의 PCH 파일을 작성해야합니다
추가New file -> Other-> PCH file

그런 다음이 PCH 파일의 경로를 빌드에 추가하십시오. setting->prefix header->path

($ (SRCROOT) /filename.pch)

여기에 이미지 설명을 입력하십시오


3
글쎄, 작업 디렉토리에 따라 변수가 다를 수 있습니다. 나는 사용하고있다$(PRODUCT_DIR)/$(PRODUCT_NAME)/PrefixHeader.pch
Alejandro Iván

.pch 파일을 특정 폴더 내에 유지하면 상황이 발생한 것입니다.
Prakash Raj

51

사진과 함께 보여 드리겠습니다!

  1. 새 파일 추가 새 파일 추가

  2. 이동 프로젝트 / 빌드 설정 / APPL LLVM 6.0 - 언어 새 파일 추가


24

.pch 파일을 추가하려면

1) 프로젝트-> 새 파일-> 기타-> PCH 파일에 새 .pch 파일 추가

2) 프로젝트의 빌드 설정으로 이동하십시오.

3) "접두사 헤더"를 검색하십시오. Apple LLVM에서 찾을 수 있습니다.

4) 필드에 붙여 넣기 $(SRCROOT)/yourPrefixHeaderFileName.pch

5) 프로젝트를 정리하고 빌드하십시오. 그게 다야 !!!

여기에 이미지 설명을 입력하십시오


12

.pch 파일을 수동으로 추가하기로 결정하고 xCode 6 이전과 같이 Objective-C를 사용하려는 경우 .pch 파일에서 UIKit 및 Foundation 프레임 워크도 가져와야합니다. 그렇지 않으면 각 헤더 파일에서 이러한 프레임 워크를 수동으로 가져와야합니다. 사용 된 언어를 테스트 할 때 다음 코드를 추가 할 수 있습니다.

#ifdef __OBJC__
    #import <UIKit/UIKit.h>
    #import <Foundation/Foundation.h>
#endif

2
ObjC 코드와 관련된 모든 것은 위의 #ifdef _ OBJC _ 안에 싸여 있어야합니다 . 그렇지 않으면 C 소스 (그러한 소스가있는 경우)에서 이해할 수없는 오류가 발생합니다
ishahak


7

새 PCH 파일을 추가하려면 다음 단계를 수행하십시오.

(1) 새로운 파일 추가-iOS 선택-기타 및 PCH 파일

(2)이 PCH 파일의 경로를 프로젝트에 추가-BuildSetting-Apple LLVM 6.0 언어

접두사 헤더 경로 설정 YourApplicationName (root-path) /filename.pch 추가


마지막으로 친절하게 설명하십시오. 세트 접두사 헤더 경로를 추가하십시오.
Naveed Abbas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.