Perché ProjectName-Prefix.pch non viene creato automaticamente in Xcode 6?


264

Perché non viene ProjectName-Prefix.pchcreato automaticamente in Xcode 6?

L'intestazione precompilata non è più necessaria?

Dove dovrei scrivere il codice che era in ProjectName-Prefix.pch precedenza?

Risposte:


136

Ho il sospetto a causa dei moduli, che rimuovono la necessità di #import <Cocoa/Cocoa.h> .

Per quanto riguarda dove inserire il codice da inserire in un'intestazione prefisso, non è necessario inserire un codice in un'intestazione prefisso. Inserisci le tue importazioni nei file che ne hanno bisogno. Inserisci le tue definizioni nei loro file. Metti le tue macro ... da nessuna parte. Smetti di scrivere macro se non c'è altro modo (come quando ne hai bisogno __FILE__). Se hai bisogno di macro, inseriscile in un'intestazione e includila.

L'intestazione del prefisso era necessaria per cose enormi e usate da quasi tutto in tutto il sistema (come Foundation.h). Se hai qualcosa di così enorme e onnipresente, dovresti ripensare la tua architettura. Le intestazioni dei prefissi rendono difficile il riutilizzo del codice e introducono sottili problemi di build se uno qualsiasi dei file elencati può cambiare. Evitali fino a quando non hai un grave problema di tempo di costruzione che puoi dimostrare è stato notevolmente migliorato con un'intestazione prefisso.

In quel caso puoi crearne uno e passarlo in clang, ma è incredibilmente raro che sia una buona idea.


EDIT: Alla tua domanda specifica su un HUD che usi in tutti i tuoi controller di visualizzazione, sì, dovresti assolutamente importarlo in ogni controller di visualizzazione che lo utilizza effettivamente. Questo rende chiare le dipendenze. Quando riutilizzi il tuo controller di visualizzazione in un nuovo progetto (cosa comune se costruisci bene i tuoi controller), saprai immediatamente cosa richiede. Ciò è particolarmente importante per le categorie, che possono rendere il codice molto difficile da riutilizzare se sono implicite.

Il file PCH non è lì per sbarazzarsi delle dipendenze degli elenchi. Dovresti comunque importare UIKit.ho Foundation.hsecondo necessità, come fanno i modelli Xcode. La ragione del PCH è di migliorare i tempi di costruzione quando si ha a che fare con intestazioni davvero enormi (come in UIKit).


102
@Rob la tua risposta è soggettiva. Non sono d'accordo che dovrebbe essere accettato come risposta a questa domanda. Come implementeresti qualcosa di simile a questo github.com/seancook/TWReverseAuthExample/blob/… senza pch? Importare il registro in ogni singolo file? Questo crea un mucchio di gonfiore inutili nel codice.
Maxim Veksler,

26
Ogni file che utilizza effettivamente quella macro, sì (nella mia esperienza questo è di solito inferiore a ogni file nel sistema). Questo è un ottimo esempio del mio punto. L'importazione in modo implicito maschera il fatto che si ha una dipendenza da questa macro di registrazione. Quando si tenta di copiare TWAPIManager.m, ad esempio, in un altro progetto, si ottengono errori TWALog()non definiti, senza alcun suggerimento su dove trovarlo. Ho riscontrato esattamente quel problema su diversi progetti di grandi dimensioni che cercavano di condividere il codice. La creazione TWAPILog.he l'importazione risolve questo con un costo di sviluppo insignificante.
Rob Napier,

5
Uso ReactiveCocoa in quasi tutte le classi, sarebbe folle per me non usare un file pch ...
Stefano Mondino,

2
Non solo moduli, ma il supporto rapido è probabilmente un pezzo grosso.
Uchuugaka,

12
La chiave è che PCH è un'intestazione precompilata . La pre-compilation è per le prestazioni della build, non per la disponibilità automatica. La pre-compilazione introduce diversi modi per rovinare la tua build e dovrebbe essere riservata a cose enormi che non cambiano mai tra build non pulite (come Foundation).
Rob Napier,

425

Senza la domanda se è corretto o meno, è possibile aggiungere manualmente il file PCH:

  1. Aggiungi un nuovo file PCH al progetto: Nuovo file> Altro> File PCH .

  2. All'opzione Impostazioni di costruzione del bersaglio , imposta il valore di prefisso sul nome del tuo file PCH, con il nome del progetto come prefisso (ovvero per il nome del progetto TestProjecte il file PCH denominato MyPrefixHeaderFile, aggiungi il valore TestProject/MyPrefixHeaderFile.pchal plist).

    MANCIA: puoi usare cose come $(SRCROOT)o $(PROJECT_DIR)per arrivare al percorso in cui hai inserito .pchil progetto.

  3. Nell'opzione Impostazioni di costruzione del bersaglio , imposta il valore di Precompila prefisso intestazione su YES.


32
Nonostante le mie opinioni sui file PCH, +1. È ancora utile che le persone sappiano come utilizzare gli strumenti.
Rob Napier,

20
@Yididya, volevo solo ringraziarti rapidamente per aver dedicato del tempo a comunicare la risposta alla domanda, nonostante qualunque giudizio tu abbia a riguardo. Apprezzo quando le persone si prendono il tempo di rispondere cordialmente alle domande piuttosto che rimproverare la persona su quanto male sia la domanda.
campo

3
Grazie. Lo trovo utile quando incorporo parte del mio Objective-C in un progetto Swift, quindi non devo tornare indietro e aggiungere un mucchio di file include a ciascuno di quei file .m.
Chris Prince,

Molto utile durante la transizione da ObjC a Swift: ho un mucchio di librerie scritte in ObjC e l'ultima cosa che voglio fare è modificarle tutte per includere le giuste intestazioni di sistema.
Echelon,

1
Questo non ha funzionato per me perché ho usato le impostazioni di costruzione del bersaglio. Tuttavia, quando ho seguito questo documento, modificando le Impostazioni di creazione progetto invece tutto ha funzionato.
Pauls,

128

È necessario creare il proprio file PCH
AggiungiNew file -> Other-> PCH file

Quindi aggiungi il percorso di questo file PCH alla tua build setting->prefix header->path

($ (SRCROOT) /filename.pch)

inserisci qui la descrizione dell'immagine


3
Bene, a seconda della directory di lavoro, le variabili potrebbero variare. Sto usando$(PRODUCT_DIR)/$(PRODUCT_NAME)/PrefixHeader.pch
Alejandro Iván il

Se si mantiene il file .pch all'interno della cartella specifica, si è verificata la situazione.
Prakash Raj,

51

Ti faccio vedere una foto!

  1. Aggiungi un nuovo file Aggiungi un nuovo file

  2. Vai a Project / Build Setting / APPl LLVM 6.0-Language Aggiungi un nuovo file


24

Per aggiungere il file .pch-

1) Aggiungi il nuovo file .pch al tuo progetto-> Nuovo file-> altro-> file PCH

2) Vai all'impostazione di costruzione del tuo progetto.

3) Cerca "intestazione prefisso". Lo puoi trovare su Apple LLVM.

4) Incollalo nel campo $(SRCROOT)/yourPrefixHeaderFileName.pch

5) Pulisci e costruisci il progetto. Questo è tutto!!!

inserisci qui la descrizione dell'immagine


12

Se decidi di aggiungere manualmente un file .pch e desideri utilizzare Objective-C come prima di xCode 6, dovrai anche importare i framework UIKit e Foundation nel file .pch. Altrimenti dovrai importare questi framework manualmente in ogni file di intestazione. Puoi comunque aggiungere il seguente codice mentre verifica la lingua utilizzata:

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

2
Tutto ciò che coinvolge il codice ObjC deve essere racchiuso nel precedente #ifdef _ OBJC _, altrimenti otterrai errori da fonti C (nel caso tu abbia tali fonti) che non capirai mai
ishahak

7

Uso :

$ (PROJECT_DIR) / Nome progetto / PrefixHeader.pch


1
Esiste un $ tipo di dichiarazione per "Nome progetto" ??
Tra il

7

Per aggiungere un nuovo file PCH, seguire i seguenti passaggi:

(1) Aggiungi nuova vista - Seleziona iOS - Altro e File PCH

(2) aggiungi il percorso di questo file PCH al tuo progetto - BuildSetting - Apple LLVM 6.0 Language

Aggiungi Imposta prefisso Percorso intestazione YourApplicationName (root-path) /filename.pch


Spiega gentilmente l'ultimo. Aggiungi il percorso di intestazione prefisso impostato.
Naveed Abbas,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.