Mengapa ProjectName-Prefix.pch tidak dibuat secara otomatis di Xcode 6?

264

Mengapa tidak ProjectName-Prefix.pchdibuat secara otomatis Xcode 6?

Apakah header precompile tidak diperlukan lagi?

Di mana saya harus menulis kode yang ProjectName-Prefix.pchsebelumnya?

Wei
sumber

Jawaban:

136

Saya curiga karena modul, yang menghapus kebutuhan untuk #import <Cocoa/Cocoa.h>.

Ke tempat untuk meletakkan kode yang akan Anda masukkan dalam header awalan, tidak ada kode yang harus Anda masukkan dalam header awalan. Masukkan impor Anda ke file yang membutuhkannya. Masukkan definisi Anda ke file mereka sendiri. Letakkan makro Anda ... di mana saja. Berhenti menulis makro kecuali tidak ada cara lain (seperti saat Anda membutuhkan __FILE__). Jika Anda benar-benar membutuhkan makro, letakkan di header dan masukkan.

Header awalan diperlukan untuk hal-hal yang sangat besar dan digunakan oleh hampir semua yang ada di seluruh sistem (seperti Foundation.h). Jika Anda memiliki sesuatu yang besar dan di mana-mana, Anda harus memikirkan kembali arsitektur Anda. Header awalan membuat kode digunakan kembali dengan keras, dan memperkenalkan masalah build yang halus jika ada file yang terdaftar dapat berubah. Hindari mereka sampai Anda memiliki masalah waktu pembangunan yang serius yang dapat Anda tunjukkan ditingkatkan secara dramatis dengan header awalan.

Dalam hal ini Anda dapat membuat satu dan mengirimkannya ke dentang, tetapi sangat jarang bahwa itu adalah ide yang bagus.


EDIT: Untuk pertanyaan spesifik Anda tentang HUD yang Anda gunakan di semua pengontrol tampilan Anda, ya, Anda harus benar-benar mengimpornya ke setiap pengontrol tampilan yang benar-benar menggunakannya. Ini membuat ketergantungannya jelas. Ketika Anda menggunakan kembali pengontrol tampilan Anda di proyek baru (yang umum jika Anda membangun pengontrol dengan baik), Anda akan segera tahu apa yang diperlukan. Ini sangat penting untuk kategori, yang dapat membuat kode sangat sulit untuk digunakan kembali jika tersirat.

File PCH tidak ada di sana untuk menghilangkan ketergantungan daftar. Anda masih harus mengimpor UIKit.hatau Foundation.hsesuai kebutuhan, seperti yang dilakukan templat Xcode. Alasan PCH adalah untuk meningkatkan waktu pembuatan ketika berhadapan dengan header yang sangat besar (seperti di UIKit).

Rob Napier
sumber
102
@Rob jawaban Anda adalah kata-kata kasar subjektif. Saya tidak setuju itu harus diterima sebagai jawaban untuk pertanyaan ini. Bagaimana Anda menerapkan sesuatu seperti ini github.com/seancook/TWReverseAuthExample/blob/… tanpa pch? Impor log ke setiap file? Ini menciptakan setumpuk mengasapi yang tidak perlu dalam kode Anda.
Maxim Veksler
26
Setiap file yang benar-benar menggunakan makro itu, ya (dalam pengalaman saya ini biasanya kurang dari setiap file dalam sistem). Ini adalah contoh yang sangat bagus dari poin saya. Mengimport secara implisit menutupi fakta bahwa Anda memiliki ketergantungan pada makro logging ini. Ketika Anda mencoba menyalin TWAPIManager.m, misalnya, ke proyek lain, Anda akan mendapatkan kesalahan yang TWALog()tidak didefinisikan, tanpa petunjuk tentang di mana menemukannya. Saya mengalami masalah itu pada beberapa proyek besar yang mencoba membagikan kode. Membuat TWAPILog.hdan mengimpornya memecahkan ini dengan biaya dev sepele.
Rob Napier
5
Saya menggunakan ReactiveCocoa di hampir setiap kelas, akan menjadi gila bagi saya untuk tidak menggunakan file pch ...
Stefano Mondino
2
Tidak hanya modul, tetapi dukungan cepat mungkin merupakan bagian besar.
uchuugaka
12
Kuncinya adalah bahwa PCH adalah header yang telah dikompilasi sebelumnya . Pra-kompilasi adalah untuk membangun kinerja, bukan ketersediaan otomatis. Pra-kompilasi memperkenalkan beberapa cara untuk mengacaukan bangunan Anda, dan harus disediakan untuk hal-hal besar yang tidak pernah berubah antara bangunan yang tidak bersih (seperti Foundation).
Rob Napier
425

Tanpa pertanyaan apakah layak atau tidak, Anda dapat menambahkan file PCH secara manual:

  1. Tambahkan file PCH baru ke proyek: File baru> Lainnya> file PCH .

  2. Pada opsi Pengaturan Bangun Target , tetapkan nilai Prefix Header ke nama file PCH Anda, dengan nama proyek sebagai awalan (yaitu untuk nama proyek TestProjectdan nama file PCH MyPrefixHeaderFile, tambahkan nilai TestProject/MyPrefixHeaderFile.pchke plist).

    TIP: Anda dapat menggunakan hal-hal seperti $(SRCROOT)atau $(PROJECT_DIR)untuk sampai ke jalur di mana Anda meletakkannya .pchdalam proyek.

  3. Pada opsi Pengaturan Bangun Target , tetapkan nilai Precompile Prefix Header ke YES.

Yedidya Reiss
sumber
32
Meskipun pendapat saya tentang file PCH, +1. Masih bermanfaat bagi orang untuk mengetahui cara menggunakan alat.
Rob Napier
20
@Yedidya, saya hanya ingin mengucapkan terima kasih karena telah meluangkan waktu untuk mengkomunikasikan jawaban atas pertanyaan terlepas dari penilaian apa pun yang Anda miliki tentang itu. Saya menghargai ketika orang meluangkan waktu untuk dengan ramah menjawab pertanyaan daripada hanya mencaci maki orang tentang betapa buruknya pertanyaan itu.
campo
3
Terima kasih. Saya merasa berguna ketika menggabungkan beberapa Objective-C saya ke dalam proyek Swift, jadi saya tidak harus kembali dan menambahkan banyak file termasuk ke masing-masing file .m.
Chris Prince
Sangat berguna saat transisi dari ObjC ke Swift - Saya memiliki banyak perpustakaan yang ditulis dalam ObjC dan hal terakhir yang ingin saya lakukan adalah mengedit semuanya untuk memasukkan header sistem yang tepat.
Eselon
1
Ini tidak berfungsi untuk saya karena saya menggunakan pengaturan build target. Namun, ketika saya mengikuti instruktur ini memodifikasi Pengaturan Bangun Proyek sebagai gantinya semuanya bekerja.
Pauls
128

Anda perlu membuat file PCH
Tambahkan sendiriNew file -> Other-> PCH file

Kemudian tambahkan path file PCH ini ke build Anda setting->prefix header->path

($ (SRCROOT) /filename.pch)

masukkan deskripsi gambar di sini

Prakash Raj
sumber
3
Nah, tergantung pada dir yang berfungsi, variabel bisa bervariasi. Saya menggunakan$(PRODUCT_DIR)/$(PRODUCT_NAME)/PrefixHeader.pch
Alejandro Iván
Jika Anda menyimpan file .pch di dalam folder tertentu, maka situasinya terjadi.
Prakash Raj
51

Saya akan menunjukkan kepada Anda dengan pic!

  1. Tambahkan File baru Tambahkan File baru

  2. Pergi ke Project / Build Setting / APPl LLVM 6.0-Language Tambahkan File baru

Slemon
sumber
24

Untuk menambahkan file .pch-

1) Tambahkan file .pch baru ke proyek Anda-> File baru-> lainnya-> file PCH

2) Goto pengaturan bangunan proyek Anda.

3) Cari "header awalan". Anda dapat menemukannya di Apple LLVM.

4) Tempel ini di bidang $(SRCROOT)/yourPrefixHeaderFileName.pch

5) Bersihkan dan bangun proyek. Itu dia!!!

masukkan deskripsi gambar di sini

Subham93
sumber
12

Jika Anda memutuskan untuk menambahkan file .pch secara manual dan Anda ingin menggunakan Objective-C seperti sebelumnya xCode 6, Anda juga harus mengimpor kerangka kerja UIKit dan Foundation dalam file .pch. Kalau tidak, Anda harus mengimpor kerangka kerja ini secara manual di setiap file header. Anda tetap dapat menambahkan kode berikut karena akan menguji bahasa yang digunakan:

#ifdef __OBJC__
    #import <UIKit/UIKit.h>
    #import <Foundation/Foundation.h>
#endif
mgm
sumber
2
Segala sesuatu yang melibatkan kode ObjC harus dimasukkan ke dalam #ifdef _ OBJC di atas , jika tidak, Anda akan mendapatkan kesalahan dari sumber C (jika Anda memiliki sumber seperti itu) yang tidak akan pernah Anda mengerti
ishahak
7

Gunakan:

$ (PROJECT_DIR) / Nama proyek / PrefixHeader.pch

Arash Zeinoddini
sumber
1
Apakah ada $ deklarasi untuk "Nama Proyek"?
Amit
7

Untuk menambah file PCH baru ikuti langkah-langkah berikut:

(1) Tambahkan Fiew Baru - Pilih iOS - Lainnya dan File PCH

(2) tambahkan jalur file PCH ini ke Proyek Anda - BuildSetting - Apple LLVM 6.0 Bahasa

Tambahkan Set Header Prefiks Header YourApplicationName (root-path) /filename.pch

Hitesh Vaghela
sumber
Mohon jelaskan yang terakhir. Tambahkan set lintasan header awalan.
Naveed Abbas