Tại sao ProjectName-Prefix.pch không được tạo tự động trong Xcode 6?


264

Tại sao không ProjectName-Prefix.pchđược tạo tự động trong Xcode 6?

Là tiêu đề tiền biên dịch không còn cần thiết?

Tôi nên viết mã ở ProjectName-Prefix.pchđâu trước đây?

Câu trả lời:


136

Tôi nghi ngờ vì các mô-đun, mà loại bỏ sự cần thiết cho #import <Cocoa/Cocoa.h>.

Về vị trí đặt mã mà bạn sẽ đặt trong tiêu đề tiền tố, không có mã nào bạn nên đặt trong tiêu đề tiền tố. Đặt nhập khẩu của bạn vào các tập tin cần chúng. Đặt định nghĩa của bạn vào các tập tin riêng của họ. Đặt macro của bạn ... không nơi nào. Dừng viết macro trừ khi không có cách nào khác (chẳng hạn như khi bạn cần __FILE__). Nếu bạn cần macro, hãy đặt chúng trong một tiêu đề và bao gồm nó.

Tiêu đề tiền tố là cần thiết cho những thứ rất lớn và được sử dụng bởi hầu hết mọi thứ trong toàn hệ thống (như Foundation.h). Nếu bạn có một cái gì đó rất lớn và có mặt khắp nơi, bạn nên suy nghĩ lại về kiến ​​trúc của mình. Các tiêu đề tiền tố làm cho việc tái sử dụng mã trở nên khó khăn và đưa ra các vấn đề xây dựng tinh tế nếu bất kỳ tệp nào được liệt kê có thể thay đổi. Tránh chúng cho đến khi bạn gặp vấn đề về thời gian xây dựng nghiêm trọng mà bạn có thể chứng minh được cải thiện đáng kể với tiêu đề tiền tố.

Trong trường hợp đó, bạn có thể tạo một cái và chuyển nó thành tiếng kêu, nhưng cực kỳ hiếm khi đó là một ý tưởng hay.


EDIT: Đối với câu hỏi cụ thể của bạn về HUD bạn sử dụng trong tất cả các bộ điều khiển xem của mình, vâng, bạn hoàn toàn nên nhập nó vào mọi bộ điều khiển xem thực sự sử dụng nó. Điều này làm cho các phụ thuộc rõ ràng. Khi bạn sử dụng lại bộ điều khiển xem của mình trong một dự án mới (điều này rất phổ biến nếu bạn xây dựng bộ điều khiển tốt), bạn sẽ biết ngay những gì nó yêu cầu. Điều này đặc biệt quan trọng đối với các danh mục, có thể khiến mã rất khó sử dụng lại nếu chúng ẩn.

Tệp PCH không có ở đó để loại bỏ các phụ thuộc danh sách. Bạn vẫn nên nhập UIKit.hhoặc Foundation.hkhi cần, như các mẫu Xcode đã làm. Lý do cho PCH là để cải thiện thời gian xây dựng khi xử lý các tiêu đề thực sự lớn (như trong UIKit).


102
@Rob câu trả lời của bạn là chủ quan. Tôi không đồng ý nó nên được chấp nhận như một câu trả lời cho câu hỏi này. Làm thế nào bạn có thể thực hiện một cái gì đó như thế này github.com/seancook/TWReverseAuthExample/blob/ mẹo mà không pch? Nhập nhật ký vào từng tập tin? Điều này tạo ra một đống bloat không cần thiết trong mã của bạn.
Maxim Veksler

26
Mỗi tệp thực sự sử dụng macro đó, vâng (theo kinh nghiệm của tôi, điều này thường ít hơn mọi tệp trong hệ thống). Đây là một ví dụ rất tốt về quan điểm của tôi. Nhập nó hoàn toàn che dấu sự thật rằng bạn có một sự phụ thuộc vào macro ghi nhật ký này. Khi bạn cố gắng sao chép TWAPIManager.m, ví dụ, sang một dự án khác, bạn sẽ gặp các lỗi TWALog()không được xác định, không có gợi ý về nơi tìm thấy nó. Tôi đã gặp chính xác vấn đề đó trên một số dự án lớn đang cố gắng chia sẻ mã. Tạo TWAPILog.hvà nhập nó giải quyết điều này với chi phí dev tầm thường.
Rob Napier

5
Tôi sử dụng ReactiveCocoa trong hầu hết các lớp, sẽ thật điên rồ khi tôi không sử dụng tệp pch ...
Stefano Mondino

2
Không chỉ các mô-đun, nhưng hỗ trợ nhanh chóng có lẽ là một phần lớn.
uchuugaka

12
Điều quan trọng là PCH là một tiêu đề được biên dịch trước . Biên dịch trước là để xây dựng hiệu suất, không có sẵn tự động. Biên dịch trước giới thiệu một số cách để làm xáo trộn bản dựng của bạn và nên được dành riêng cho những thứ khổng lồ không bao giờ thay đổi giữa các bản dựng không sạch (như Foundation).
Rob Napier

425

Nếu không có câu hỏi có phù hợp hay không, bạn có thể thêm tệp PCH theo cách thủ công:

  1. Thêm tệp PCH mới vào dự án: Tệp mới> Khác> tệp PCH .

  2. Trong tùy chọn Cài đặt bản dựng của Target , đặt giá trị của Header Header thành tên tệp PCH của bạn, với tên dự án là tiền tố (nghĩa là đối với tên dự án TestProjectvà tệp PCH MyPrefixHeaderFile, hãy thêm giá trị TestProject/MyPrefixHeaderFile.pchvào plist).

    MIPO: Bạn có thể sử dụng những thứ như $(SRCROOT)hoặc $(PROJECT_DIR)để đi đến con đường nơi bạn đặt .pchdự án.

  3. Trong tùy chọn Cài đặt bản dựng của Target , đặt giá trị của Tiêu đề tiền tố biên dịch thành YES.


32
Bất chấp ý kiến ​​của tôi về các tệp PCH, +1. Nó vẫn hữu ích cho mọi người biết cách sử dụng các công cụ.
Rob Napier

20
@Yedidya, tôi chỉ muốn nói một lời cảm ơn nhanh chóng vì đã dành thời gian để truyền đạt câu trả lời cho câu hỏi bất chấp mọi phán xét của bạn về nó. Tôi đánh giá cao khi mọi người dành thời gian để trả lời một cách thân mật các câu hỏi thay vì chỉ nói với người đó về việc làm thế nào để khuyên câu hỏi đó.
campo

3
Cảm ơn. Tôi thấy nó hữu ích khi kết hợp một số Objective-C của tôi vào dự án Swift, vì vậy tôi không phải quay lại và thêm một loạt các tệp đính kèm vào mỗi tệp .m đó.
Hoàng tử Chris

Rất tiện lợi khi chuyển từ ObjC sang Swift - Tôi có một đống thư viện được viết bằng ObjC và điều cuối cùng tôi muốn làm là chỉnh sửa tất cả chúng để bao gồm các tiêu đề hệ thống phù hợp.
Echelon

1
Điều này không hiệu quả với tôi vì tôi đã sử dụng cài đặt bản dựng của mục tiêu. Tuy nhiên, khi tôi làm theo hướng dẫn này, sửa đổi Cài đặt Xây dựng Dự án thay vì mọi thứ đều hoạt động.
Pauls

128

Bạn cần tạo tập tin PCH riêng
ThêmNew file -> Other-> PCH file

Sau đó thêm đường dẫn của tệp PCH này vào bản dựng của bạn setting->prefix header->path

($ (SRCROOT) /filename.pch)

nhập mô tả hình ảnh ở đây


3
Vâng, tùy thuộc vào thư mục làm việc, các biến có thể khác nhau. Tôi đang sử dụng$(PRODUCT_DIR)/$(PRODUCT_NAME)/PrefixHeader.pch
Alejandro Iván

Nếu bạn giữ tệp .pch trong thư mục cụ thể thì tình huống sẽ xảy ra.
Prakash Raj

51

Tôi sẽ chỉ cho bạn một bức ảnh!

  1. Thêm một tệp mới Thêm một tệp mới

  2. Chuyển đến Project / Build Settings / APPl LLVM 6.0-Language Thêm một tệp mới


24

Để thêm tệp .pch-

1) Thêm tệp .pch mới vào dự án của bạn-> Tệp mới-> khác-> tệp PCH

2) Goto cài đặt xây dựng dự án của bạn.

3) Tìm kiếm "tiêu đề tiền tố". Bạn có thể tìm thấy điều đó dưới Apple LLVM.

4) Dán cái này vào trường $(SRCROOT)/yourPrefixHeaderFileName.pch

5) Làm sạch và xây dựng dự án. Đó là nó!!!

nhập mô tả hình ảnh ở đây


12

Nếu bạn quyết định thêm tệp .pch theo cách thủ công và bạn muốn sử dụng Objective-C giống như trước xCode 6, bạn cũng sẽ phải nhập các khung UIKit và Foundation trong tệp .pch. Nếu không, bạn sẽ phải nhập các khung này theo cách thủ công trong mỗi tệp tiêu đề. Bạn vẫn có thể thêm đoạn mã sau vì nó kiểm tra ngôn ngữ được sử dụng:

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

2
Mọi thứ liên quan đến mã ObjC phải được gói bên trong #ifdef _ OBJC _ ở trên , nếu không bạn sẽ gặp lỗi từ các nguồn C (trong trường hợp bạn có các nguồn như vậy) mà bạn sẽ không bao giờ hiểu được
ishahak

7

Sử dụng :

$ (PRO DỰ_DIR) / Tên dự án / PrefixHeader.pch


1
Có bất kỳ loại khai báo $ nào tồn tại cho "Tên dự án" không ??
Amit

7

Để thêm tệp PCH mới, hãy làm theo các bước dưới đây:

(1) Thêm fiew mới - Chọn iOS - Tệp khác và PCH

(2) thêm đường dẫn của tệp PCH này vào Dự án của bạn - BuildSetting - Ngôn ngữ Apple LLVM 6.0

Thêm đường dẫn tiêu đề tiền tố YourApplicationName (đường dẫn gốc) /filename.pch


Vui lòng giải thích cái cuối cùng. Thêm đường dẫn tiêu đề tiền tố.
Naveed Abbas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.