¿Por qué ProjectName-Prefix.pch no se crea automáticamente en Xcode 6?

264

¿Por qué no se ProjectName-Prefix.pchcrea automáticamente en Xcode 6?

¿Ya no se necesita el encabezado de precompilación?

¿Dónde debo escribir el código que estaba ProjectName-Prefix.pchantes?

Wei
fuente

Respuestas:

136

Sospecho que debido a los módulos, que eliminan la necesidad de #import <Cocoa/Cocoa.h>.

En cuanto a dónde colocar el código que colocaría en un encabezado de prefijo, no hay código que deba colocar en un encabezado de prefijo. Coloque sus importaciones en los archivos que las necesitan. Pon tus definiciones en sus propios archivos. Pon tus macros ... en ninguna parte. Deje de escribir macros a menos que no haya otra manera (como cuando lo necesita __FILE__). Si necesita macros, colóquelas en un encabezado e inclúyalas.

El encabezado del prefijo era necesario para cosas enormes y utilizadas por casi todo en todo el sistema (como Foundation.h). Si tiene algo tan grande y omnipresente, debe repensar su arquitectura. Los encabezados de prefijo dificultan la reutilización del código e introducen problemas sutiles de compilación si alguno de los archivos enumerados puede cambiar. Evítelos hasta que tenga un problema serio de tiempo de compilación que pueda demostrar que mejora dramáticamente con un encabezado de prefijo.

En ese caso, puede crear uno y pasarlo al sonido metálico, pero es increíblemente raro que sea una buena idea.


EDITAR: a su pregunta específica sobre un HUD que usa en todos sus controladores de vista, sí, debe importarlo absolutamente a cada controlador de vista que realmente lo use. Esto aclara las dependencias. Cuando reutilice su controlador de vista en un nuevo proyecto (lo cual es común si construye bien sus controladores), sabrá de inmediato lo que requiere. Esto es especialmente importante para las categorías, que pueden hacer que el código sea muy difícil de reutilizar si están implícitas.

El archivo PCH no está allí para deshacerse de las dependencias de la lista. Aún debe importar UIKit.ho Foundation.hsegún sea necesario, como lo hacen las plantillas de Xcode. La razón de la PCH es mejorar los tiempos de compilación cuando se trata de encabezados realmente masivos (como en UIKit).

Rob Napier
fuente
102
@Rob tu respuesta es una crítica subjetiva. No estoy de acuerdo con que deba aceptarse como respuesta a esta pregunta. ¿Cómo implementaría algo como esto github.com/seancook/TWReverseAuthExample/blob/… sin pch? Importar el registro en todos y cada uno de los archivos? Esto crea una pila completa de hinchazón innecesaria en su código.
Maxim Veksler
26
Cada archivo que realmente usa esa macro, sí (en mi experiencia, esto suele ser menor que todos los archivos del sistema). Este es un muy buen ejemplo de mi punto. Importarlo enmascara implícitamente el hecho de que usted depende de esta macro de registro. Cuando intente copiar TWAPIManager.m, por ejemplo, a otro proyecto, obtendrá errores que TWALog()no están definidos, sin ninguna pista sobre dónde encontrarlo. He encontrado exactamente ese problema en varios proyectos grandes que intentan compartir código. Crearlo TWAPILog.he importarlo resuelve esto con un costo de desarrollo trivial.
Rob Napier
55
Uso ReactiveCocoa en casi todas las clases, sería una locura para mí no usar un archivo pch ...
Stefano Mondino
2
No solo los módulos, sino que el soporte rápido es probablemente una gran pieza.
uchuugaka
12
La clave es que PCH es un encabezado precompilado . La compilación previa es para el rendimiento de la compilación, no para la disponibilidad automática. La compilación previa presenta varias formas de estropear su compilación, y debe reservarse para cosas enormes que nunca cambian entre compilaciones no limpias (como Foundation).
Rob Napier
425

Sin la pregunta de si es correcto o no, puede agregar el archivo PCH manualmente:

  1. Agregue un nuevo archivo PCH al proyecto: Nuevo archivo> Otro> Archivo PCH .

  2. En la opción Configuración de compilación del objetivo , establezca el valor de Encabezado de prefijo en el nombre de su archivo PCH, con el nombre del proyecto como prefijo (es decir, para el nombre del proyecto TestProjecty el nombre del archivo PCH MyPrefixHeaderFile, agregue el valor TestProject/MyPrefixHeaderFile.pchal plist).

    CONSEJO: Puedes usar cosas como $(SRCROOT)o $(PROJECT_DIR)para llegar a la ruta de donde pones .pchel proyecto.

  3. En la opción Configuración de compilación del objetivo , establezca el valor de Precompile Prefix Header en YES.

Yedidya Reiss
fuente
32
A pesar de mis opiniones sobre los archivos PCH, +1. Todavía es útil para las personas saber cómo usar las herramientas.
Rob Napier
20
@Yedidya, solo quería agradecerle rápidamente por tomarse el tiempo para comunicar la respuesta a la pregunta a pesar de los juicios que tenga al respecto. Aprecio cuando la gente se toma el tiempo de responder cordialmente las preguntas en lugar de regañar a la persona por lo mal que le aconsejó la pregunta.
campo
3
Gracias. Me resulta útil al incorporar algunos de mis Objective-C en un proyecto Swift, por lo que no tengo que volver atrás y agregar un montón de archivos de inclusión a cada uno de esos archivos .m.
Chris Prince
Muy útil cuando hago la transición de ObjC a Swift: tengo un montón de bibliotecas escritas en ObjC y lo último que quiero hacer es editarlas todas para incluir los encabezados del sistema correctos.
Echelon
1
Esto no funcionó para mí porque utilicé la configuración de compilación del objetivo. Sin embargo, cuando seguí este instructino modificando la configuración de construcción del proyecto, todo funcionó.
Pauls
128

Necesita crear su propio archivo PCH
AgregarNew file -> Other-> PCH file

Luego agregue la ruta de este archivo PCH a su compilación setting->prefix header->path

($ (SRCROOT) /filename.pch)

ingrese la descripción de la imagen aquí

Prakash Raj
fuente
3
Bueno, dependiendo del directorio de trabajo, las variables pueden variar. Estoy usando$(PRODUCT_DIR)/$(PRODUCT_NAME)/PrefixHeader.pch
Alejandro Iván
Si mantiene el archivo .pch dentro de la carpeta particular, se produjo la situación.
Prakash Raj
51

Te voy a mostrar con una foto!

  1. Agregar un nuevo archivo Agregar un nuevo archivo

  2. Vaya a Proyecto / Configuración de compilación / APPl LLVM 6.0-Language Agregar un nuevo archivo

Slemon
fuente
24

Para agregar un archivo .pch

1) Agregue un nuevo archivo .pch a su proyecto-> Nuevo archivo-> otro-> archivo PCH

2) Pase a la configuración de compilación de su proyecto.

3) Buscar "encabezado de prefijo". Puede encontrar eso en Apple LLVM.

4) Pega esto en el campo $(SRCROOT)/yourPrefixHeaderFileName.pch

5) Limpiar y construir el proyecto. ¡¡¡Eso es!!!

ingrese la descripción de la imagen aquí

Subham93
fuente
12

Si decide agregar un archivo .pch manualmente y desea usar Objective-C como antes de xCode 6, también deberá importar los marcos UIKit y Foundation en el archivo .pch. De lo contrario, deberá importar estos marcos manualmente en cada archivo de encabezado. Puede agregar el siguiente código de todos modos, ya que prueba el idioma utilizado:

#ifdef __OBJC__
    #import <UIKit/UIKit.h>
    #import <Foundation/Foundation.h>
#endif
mgm
fuente
2
Todo lo que implica el código ObjC debe estar envuelto dentro del #ifdef _ OBJC _ anterior, de lo contrario obtendrá errores de las fuentes C (en caso de que tenga tales fuentes) que nunca entenderá
ishahak
7

Utilizar :

$ (PROJECT_DIR) / Nombre del proyecto / PrefixHeader.pch

Arash Zeinoddini
fuente
1
¿Existe algún tipo de declaración de $ para "Nombre del proyecto"?
Amit
7

Para agregar un nuevo archivo PCH, siga los siguientes pasos:

(1) Agregar nueva vista - Seleccionar iOS - Otro y archivo PCH

(2) agregue la ruta de este archivo PCH a su proyecto - BuildSetting - Apple LLVM 6.0 Language

Agregue la ruta del encabezado del prefijo establecido YourApplicationName (root-path) /filename.pch

Hitesh Vaghela
fuente
Por favor explique el último. Agregue la ruta del encabezado del prefijo establecido.
Naveed Abbas