เหตุใด ProjectName-Prefix.pch จึงไม่สร้างขึ้นโดยอัตโนมัติใน Xcode 6


264

เหตุใดจึงไม่ProjectName-Prefix.pchสร้างอัตโนมัติXcode 6 ?

ส่วนหัวของ precompile นั้นไม่จำเป็นอีกต่อไปหรือไม่?

ฉันควรเขียนรหัสที่เคยมีProjectName-Prefix.pchมาก่อนที่ไหน

คำตอบ:


136

ฉันสงสัยว่าเป็นเพราะโมดูลซึ่งลบความต้องการสำหรับ #import <Cocoa/Cocoa.h>ฉันสงสัยว่าเพราะของโมดูลซึ่งเอาความต้องการสำหรับ

ในกรณีที่จะใส่รหัสที่คุณจะใส่ในส่วนหัวของคำนำหน้าไม่มีรหัสคุณควรใส่ในส่วนหัวของคำนำหน้า ใส่การนำเข้าของคุณลงในไฟล์ที่ต้องการ ใส่คำจำกัดความของคุณลงในไฟล์ของตนเอง ใส่มาโครของคุณ ... ไม่มีที่ไหนเลย หยุดเขียนมาโครเว้นแต่จะไม่มีวิธีอื่น (เช่นเมื่อคุณต้องการ__FILE__ ) หากคุณต้องการมาโครให้ใส่ไว้ในส่วนหัวและรวมไว้

ส่วนหัวของคำนำหน้านั้นจำเป็นสำหรับสิ่งที่มีขนาดใหญ่และใช้งานได้เกือบทุกอย่างในระบบทั้งหมด (เช่น Foundation.h ) หากคุณมีสิ่งที่ยิ่งใหญ่และแพร่หลายคุณควรพิจารณาสถาปัตยกรรมของคุณใหม่ ส่วนหัวของคำนำหน้าทำให้โค้ดนำมาใช้ซ้ำได้ยากและแนะนำปัญหาการสร้างที่ละเอียดอ่อนหากไฟล์ใด ๆ ในรายการที่สามารถเปลี่ยนแปลงได้ หลีกเลี่ยงปัญหาเหล่านี้จนกว่าคุณจะมีปัญหาเวลาสร้างร้ายแรงที่คุณสามารถสาธิตได้รับการปรับปรุงอย่างมากด้วยส่วนหัวของคำนำหน้า

ในกรณีนี้คุณสามารถสร้างมันขึ้นมาแล้วส่งไปยังเสียงดังกราว แต่มันหายากอย่างเหลือเชื่อที่มันเป็นความคิดที่ดี


แก้ไข: สำหรับคำถามเฉพาะของคุณเกี่ยวกับ HUD ที่คุณใช้ในตัวควบคุมมุมมองทั้งหมดของคุณใช่คุณควรนำเข้ามันอย่างแน่นอนในทุกตัวควบคุมมุมมองที่ใช้งานจริง สิ่งนี้ทำให้การอ้างอิงชัดเจน เมื่อคุณใช้ตัวควบคุมมุมมองของคุณในโครงการใหม่ (ซึ่งเป็นเรื่องปกติถ้าคุณสร้างตัวควบคุมของคุณได้ดี) คุณจะรู้ทันทีว่ามันต้องการอะไร สิ่งนี้มีความสำคัญอย่างยิ่งสำหรับหมวดหมู่ซึ่งสามารถทำให้รหัสยากที่จะนำมาใช้ซ้ำหากพวกเขาโดยนัย

ไฟล์ PCH ไม่ได้อยู่ที่นั่นเพื่อกำจัดรายการอ้างอิง คุณควรยังคงนำเข้าUIKit.hหรือFoundation.hตามความจำเป็นเช่นเดียวกับแม่แบบ Xcode เหตุผลสำหรับ PCH คือการปรับปรุงเวลาที่สร้างเมื่อต้องรับมือกับส่วนหัวขนาดใหญ่มาก (เช่นใน UIKit)


102
@ ปล้นคำตอบของคุณคือการพูดจาหยาบคาย ฉันไม่เห็นด้วยที่ควรยอมรับว่าเป็นคำตอบสำหรับคำถามนี้ คุณจะใช้บางอย่างเช่นgithub.com/seancook/TWReverseAuthExample/blob/นี้อย่างไรโดยไม่ใช้ pch นำเข้าบันทึกลงในแต่ละไฟล์หรือไม่ สิ่งนี้จะสร้างกองโตที่ไม่จำเป็นในโค้ดของคุณ
Maxim Veksler

26
แต่ละไฟล์ที่ใช้มาโครนั้นจริง ๆ แล้วใช่ (โดยประสบการณ์ของฉันมักจะน้อยกว่าทุกไฟล์ในระบบ) นี่เป็นตัวอย่างที่ดีมากในประเด็นของฉัน การนำเข้าจะปกปิดความจริงที่ว่าคุณมีการพึ่งพาแมโครการบันทึกนี้โดยนัย เมื่อคุณพยายามคัดลอกTWAPIManager.mไปยังโครงการอื่นคุณจะได้รับข้อผิดพลาดที่TWALog()ไม่ได้กำหนดไว้โดยไม่มีคำใบ้เกี่ยวกับตำแหน่งที่จะค้นหา ฉันพบปัญหาดังกล่าวในโครงการขนาดใหญ่หลายแห่งที่พยายามแบ่งปันรหัส การสร้างTWAPILog.hและนำเข้าจะช่วยแก้ปัญหานี้ด้วยต้นทุน dev เล็กน้อย
Rob Napier

5
ฉันใช้ ReactiveCocoa ในเกือบทุกชั้นมันจะบ้าสำหรับฉันที่จะไม่ใช้ไฟล์ pch ...
Stefano Mondino

2
ไม่เพียงแค่โมดูล แต่การรองรับที่รวดเร็วอาจเป็นเรื่องใหญ่
uchuugaka

12
ที่สำคัญคือ PCH เป็นส่วนหัวก่อนรวบรวม การรวบรวมล่วงหน้าสำหรับสร้างประสิทธิภาพไม่ใช่ความพร้อมอัตโนมัติ การคอมไพล์ล่วงหน้าแนะนำหลายวิธีในการสร้างงานของคุณและควรสงวนไว้สำหรับสิ่งที่ยิ่งใหญ่ที่ไม่เคยเปลี่ยนระหว่างงานสร้างที่ไม่สะอาด (เช่นพื้นฐาน)
Rob Napier

425

หากไม่มีคำถามว่าเหมาะสมหรือไม่คุณสามารถเพิ่มไฟล์ PCH ด้วยตนเอง:

  1. เพิ่มไฟล์ PCH ใหม่กับโครงการ: ไฟล์> อื่น ๆ > แฟ้ม

  2. ที่ตัวเลือกBuild 's Target ตั้งค่าของPrefix Headerเป็นชื่อไฟล์ PCH ของคุณโดยใช้ชื่อโปรเจ็กต์เป็นคำนำหน้า (เช่นสำหรับโปรเจ็กต์ที่มีชื่อTestProjectและไฟล์ PCH ที่ชื่อMyPrefixHeaderFileเพิ่มค่าTestProject/MyPrefixHeaderFile.pchให้เพลต)

    เคล็ดลับ:คุณสามารถใช้สิ่งต่าง ๆ เช่น$(SRCROOT)หรือ$(PROJECT_DIR)ไปยังเส้นทางที่คุณใส่ไว้.pchในโครงการ

  3. ในเป้าหมายของการตั้งค่าการสร้างตัวเลือกการตั้งค่าของprecompile คำนำหน้าหัวYESไป


32
แม้จะมีความคิดเห็นของฉันเกี่ยวกับไฟล์ PCH แต่ +1 มันยังมีประโยชน์สำหรับคนที่จะรู้วิธีการใช้เครื่องมือ
Rob Napier

20
@ Yedidya ฉันแค่อยากจะขอบคุณอย่างรวดเร็วสำหรับการใช้เวลาในการสื่อสารคำตอบสำหรับคำถามแม้จะมีการตัดสินอะไรก็ตามที่คุณมีเกี่ยวกับมัน ฉันรู้สึกซาบซึ้งเมื่อมีคนใช้เวลาในการตอบคำถามอย่างจริงใจมากกว่าแค่พูดด่าคนที่รู้ว่าคำถามนั้นไม่ดี
campo

3
ขอบคุณ ฉันพบว่ามีประโยชน์เมื่อรวม Objective-C บางส่วนของฉันเข้ากับโครงการ Swift ดังนั้นฉันจึงไม่ต้องย้อนกลับไปและเพิ่มไฟล์รวมเข้าไปในไฟล์. m แต่ละไฟล์
Chris Prince

มีประโยชน์มากเมื่อเปลี่ยนจาก ObjC เป็น Swift - ฉันมีห้องสมุดมากมายที่เขียนใน ObjC และสิ่งสุดท้ายที่ฉันอยากทำคือแก้ไขทั้งหมดเพื่อให้รวมส่วนหัวของระบบที่ถูกต้อง
ระดับ

1
สิ่งนี้ไม่ทำงานสำหรับฉันเพราะฉันใช้การตั้งค่าการสร้างของเป้าหมาย อย่างไรก็ตามเมื่อฉันทำตามคำแนะนำนี้แก้ไขการตั้งค่าการสร้างโครงการแทนทุกอย่างทำงาน
Pauls

128

คุณต้องสร้างไฟล์ PCH ของตัวเอง
เพิ่มNew file -> Other-> PCH file

จากนั้นเพิ่มเส้นทางของไฟล์ PCH นี้ไปยังงานสร้างของคุณ setting->prefix header->path

($ (SRCROOT) /filename.pch)

ป้อนคำอธิบายรูปภาพที่นี่


3
ดีขึ้นอยู่กับ dir ทำงานตัวแปรอาจแตกต่างกันไป ฉันกำลังใช้$(PRODUCT_DIR)/$(PRODUCT_NAME)/PrefixHeader.pch
Alejandro Iván

หากคุณเก็บไฟล์. pch ไว้ในโฟลเดอร์เฉพาะแสดงว่าสถานการณ์นั้นเกิดขึ้น
Prakash Raj

51

ฉันจะแสดงให้คุณเห็นด้วยรูป!

  1. เพิ่มไฟล์ใหม่ เพิ่มไฟล์ใหม่

  2. ไปที่การตั้งค่าโครงการ / สร้าง / แอป LLVM 6.0- ภาษา เพิ่มไฟล์ใหม่


24

ในการเพิ่ม. pch ไฟล์ -

1) เพิ่มไฟล์. pch ใหม่ในโครงการของคุณ -> ไฟล์ใหม่ -> อื่น ๆ -> ไฟล์ PCH

2) ไปที่การตั้งค่าการสร้างโครงการของคุณ

3) ค้นหา "ส่วนหัวคำนำหน้า" คุณสามารถค้นหาได้ภายใต้ Apple LLVM

4) วางสิ่งนี้ลงในช่อง $(SRCROOT)/yourPrefixHeaderFileName.pch

5) ทำความสะอาดและสร้างโครงการ แค่นั้นแหละ!!!

ป้อนคำอธิบายรูปภาพที่นี่


12

หากคุณตัดสินใจที่จะเพิ่มไฟล์. pch ด้วยตนเองและคุณต้องการใช้ Objective-C เหมือนก่อนหน้า xCode 6 คุณจะต้องนำเข้า UIKit และ Foundation frameworks ในไฟล์. pch มิฉะนั้นคุณจะต้องนำเข้าเฟรมเวิร์กเหล่านี้ด้วยตนเองในแต่ละไฟล์ส่วนหัว คุณสามารถเพิ่มรหัสต่อไปนี้ในขณะที่มันทดสอบภาษาที่ใช้:

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

2
ทุกอย่างที่เกี่ยวข้องกับรหัส ObjC จะต้องอยู่ใน #ifdef _ OBJC _ ข้างต้นไม่เช่นนั้นคุณจะได้รับข้อผิดพลาดจากแหล่ง C (ในกรณีที่คุณมีแหล่งข้อมูลดังกล่าว) ที่คุณจะไม่เข้าใจ
ishahak

7

การใช้:

$ (PROJECT_DIR) / ชื่อโครงการ / PrefixHeader.pch


1
มีการประกาศ $ ชนิดใดสำหรับ "ชื่อโครงการ" หรือไม่?
Amit

7

สำหรับการเพิ่มไฟล์ PCH ใหม่ทำตามขั้นตอนต่อไปนี้:

(1) เพิ่ม fiew ใหม่ - เลือก iOS - อื่น ๆ และไฟล์ PCH

(2) เพิ่มพา ธ ของไฟล์ PCH นี้ไปยังโครงการของคุณ - BuildSetting - Apple LLVM 6.0 Language

เพิ่มชุดคำนำหน้าส่วนหัวเส้นทาง YourApplicationName (root-path) /filename.pch


กรุณาอธิบายสุดท้าย เพิ่มเส้นทางส่วนหัวของคำนำหน้าชุด
Naveed Abbas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.